Вопрос:

Java: проверка, равен ли бит 0 или 1 в длинной

java long-integer bit-shift

66443 просмотра

14 ответа

3617 Репутация автора

Какой метод вы бы использовали, чтобы определить, является ли бит, который представляет 2 ^ x, 1 или 0?

Автор: Ande TURNER Источник Размещён: 07.07.2009 01:41

Ответы (14)


166 плюса

1143601 Репутация автора

Решение

Я бы использовал:

if ((value & (1L << x)) != 0)
{
   // The bit was set
}

(Возможно, вам удастся избежать меньшего количества скобок, но я никогда не помню приоритет побитовых операций.)

Автор: Jon Skeet Размещён: 07.07.2009 01:42

8 плюса

118930 Репутация автора

Для nмладшего разряда (младший бит) должно работать следующее:

boolean isSet = (value & (1 << n)) != 0;
Автор: Noldorin Размещён: 07.07.2009 01:43

2 плюса

2322 Репутация автора

Значение бита 2 ^ x равно «variable & (1 << x)»

Автор: Artur Soler Размещён: 07.07.2009 01:43

4 плюса

44160 Репутация автора

Бит сдвигается вправо на х и проверяется младший бит.

Автор: schnaader Размещён: 07.07.2009 01:44

12 плюса

6326 Репутация автора

Вы также можете использовать

bool isSet = ((value>>x) & 1) != 0;

РЕДАКТИРОВАТЬ: разница между " (value>>x) & 1" и " value & (1<<x)" зависит от поведения, когда х больше, чем размер типа "значение" (32 в вашем случае).

В этом конкретном случае, с " (value>>x) & 1" у вас будет знак значения, тогда как вы получите 0 с " value & (1<<x)" (иногда полезно получить битовый знак, если x слишком велик).

Если вы предпочитаете иметь 0 в этом случае, вы можете использовать >>>оператор " " вместо if " >>"

Итак, " ((value>>>x) & 1) != 0" и " (value & (1<<x)) != 0" полностью эквивалентны

Автор: ThibThib Размещён: 07.07.2009 01:46

90 плюса

39355 Репутация автора

Другая альтернатива:

if (BigInteger.valueOf(value).testBit(x)) {
    // ...
}
Автор: finnw Размещён: 07.07.2009 02:05

14 плюса

3617 Репутация автора

Интересно, если:

  if (((value >>> x) & 1) != 0) {

  }

.. лучше, потому что не имеет значения, является ли значение длинным или нет, или его хуже, потому что это менее очевидно.

Том Хотин - 7 июля в 14:16

Автор: Ande TURNER Размещён: 15.07.2009 10:26

6 плюса

26645 Репутация автора

Вы можете попробовать BitSet: http://java.sun.com/javase/6/docs/api/java/util/BitSet.html

Автор: Yannick Motton Размещён: 29.08.2009 11:56

-2 плюса

740 Репутация автора

Устраните сдвиг битов и его сложности и используйте LUT для правильного andоперанда.

Автор: typeseven Размещён: 30.08.2009 03:00

0 плюса

1 Репутация автора

Мой вклад - игнорировать предыдущий

public class TestBits { 

    public static void main(String[] args) { 

        byte bit1 = 0b00000001;     
        byte bit2 = 0b00000010;
        byte bit3 = 0b00000100;
        byte bit4 = 0b00001000;
        byte bit5 = 0b00010000;
        byte bit6 = 0b00100000;
        byte bit7 = 0b01000000;

        byte myValue = 9;                        // any value

        if (((myValue >>> 3) & bit1 ) != 0) {    //  shift 3 to test bit4
            System.out.println(" ON "); 
        }
    } 
}
Автор: Miguel Alonso Mosquera Размещён: 28.09.2012 11:27

1 плюс

0 Репутация автора

объявите временную переменную int и сделайте ее равной оригиналу. затем сдвиньте temp >> x раз, чтобы бит, который вы хотите проверить, был в последней позиции. затем выполните temp & 0xf, чтобы удалить предыдущие биты. Теперь осталось с последним битом. Наконец, сделайте, если (y & 1 == 0), если последний бит равен 1, это должно быть равно 0, иначе будет равно 1. Это либо то, либо если (y + 0x1 == 0) ... не слишком уверен. дурачиться и посмотреть

Автор: user1893702 Размещён: 17.12.2012 06:45

1 плюс

3768 Репутация автора

Если кому-то не очень удобны побитовые операторы, то приведенный ниже код можно попробовать программно решить. Есть два пути.

1) Используйте функциональность языка Java, чтобы получить строку двоичного формата, а затем проверить символ в определенной позиции

2) Продолжайте делить на 2 и определите значение бита в определенной позиции.

public static void main(String[] args) {
    Integer n =1000;
    String binaryFormat =  Integer.toString(n, 2);
    int binaryFormatLength = binaryFormat.length();
    System.out.println("binaryFormat="+binaryFormat);
    for(int i = 1;i<10;i++){
        System.out.println("isBitSet("+n+","+i+")"+isBitSet(n,i));
        System.out.println((binaryFormatLength>=i && binaryFormat.charAt(binaryFormatLength-i)=='1'));
    }

}

public static boolean isBitSet(int number, int position){
    int currPos =1;
    int temp = number;
    while(number!=0 && currPos<= position){
        if(temp%2 == 1 && currPos == position)
            return true;
        else{
            temp = temp/2;
            currPos ++;
        }
    }
    return false;
}

Выход

binaryFormat=1111101000
isBitSet(1000,1)false
false
isBitSet(1000,2)false
false
isBitSet(1000,3)false
false
isBitSet(1000,4)true
true
isBitSet(1000,5)false
false
isBitSet(1000,6)true
true
isBitSet(1000,7)true
true
isBitSet(1000,8)true
true
isBitSet(1000,9)true
true
Автор: Kaushik Lele Размещён: 14.06.2014 10:12

0 плюса

598 Репутация автора

Я написал небольшой статический класс, который выполняет некоторые операции с битами.

public final class Bitfield {

  private Bitfield() {}

  // ********************************************************************
  // * TEST
  // ********************************************************************

  public static boolean testBit(final int pos, final int bitfield) {
      return (bitfield & (1 << pos)) == (1 << pos);
  }

  public static boolean testNum(final int num, final int bitfield) {
      return (bitfield & num) == num;
  }

  // ********************************************************************
  // * SET
  // ********************************************************************

  public static int setBit(final int pos, final int bitfield) {
     return bitfield | (1 << pos);
  }

  public static int addNum(final int number, final int bitfield) {
      return bitfield | number;
  }

  // ********************************************************************
  // * CLEAR
  // ********************************************************************

  public static int clearBit(final int pos, final int bitfield) {
      return bitfield ^ (1 << pos);
  }

  public static int clearNum(final int num, final int bitfield) {
      return bitfield ^ num;
  }

  }

Если есть какие-то вопросы, просто напишите мне письмо.

Хорошее программирование!

Автор: Alessandro Giusa Размещён: 14.10.2015 04:23

4 плюса

1802 Репутация автора

В Java хорошо работает следующее:

if (value << ~x < 0) {
   // xth bit set
} else {
   // xth bit not set
}

valueи xможет быть intили long(и не должны быть одинаковыми).

Предупреждение для не Java-программистов : предыдущее выражение работает в Java, потому что в этом языке операторы сдвига бит применяются только к 5 (или 6, в случае long) младшим битам правого операнда. Это неявно переводит выражение в value << (~x & 31)(или value << (~x & 63)если valueесть long).

Javascript : он также работает в javascript (как и в java, применяются только самые низкие 5 битов числа сдвигов). В JavaScript любой number32-битный.

В частности, в C отрицательное число сдвигов вызывает неопределенное поведение, поэтому этот тест не обязательно будет работать (хотя может и зависеть от вашей конкретной комбинации компилятор / процессор).

Автор: rslemos Размещён: 12.01.2016 02:45
Вопросы из категории :
32x32