Подтвердить что ты не робот

Как установить/отключить бит в определенной позиции длинной?

Как установить/отключить бит в определенной позиции длинного в Java?

Например,

long l = 0b001100L ; // bit representation

Я хочу установить бит в позиции 2 и установить бит в позиции 3, таким образом, будет длинным будет

long l = 0b001010L ; // bit representation

Может кто-нибудь помочь мне, как это сделать?

4b9b3361

Ответ 1

Чтобы установить бит, используйте:

x |= 0b1; // set LSB bit
x |= 0b10; // set 2nd bit from LSB

чтобы стереть бит:

x &= ~0b1; // unset LSB bit (if set)
x &= ~0b10; // unset 2nd bit from LSB

для переключения бит:

x ^= 0b1;

Обратите внимание, что я использую 0b?. Вы также можете использовать любое целое число, например:

x |= 4; // sets 3rd bit
x |= 0x4; // sets 3rd bit
x |= 0x10; // sets 9th bit

Однако это затрудняет определение того, какой бит изменяется.

Использование двоичного файла позволяет вам видеть, какие точные биты будут установлены/стерты/переключены.

Чтобы динамически установить бит, используйте:

x |= (1 << y); // set the yth bit from the LSB

(1 << y) сдвигает... 001 y места слева, поэтому вы можете перемещать заданные биты y.

Вы также можете установить сразу несколько бит:

x |= (1 << y) | (1 << z); // set the yth and zth bit from the LSB

Или для отмены:

x &= ~((1 << y) | (1 << z)); // unset yth and zth bit

Или для переключения:

x ^= (1 << y) | (1 << z); // toggle yth and zth bit

Ответ 2

Наименее значащий бит (lsb) обычно называют бит 0, поэтому ваша "позиция 2" действительно "бит 1".

long x = 0b001100;  // x now = 0b001100
x |= (1<<1);        // x now = 0b001110 (bit 1 set)
x &= ~(1<<2);       // x now = 0b001010 (bit 2 cleared)

Ответ 3

Я выбрал бы BigInteger для этого...

class Test {
    public static void main(String[] args) throws Exception {
        Long value = 12L;
        BigInteger b = new BigInteger(String.valueOf(value));
        System.out.println(b.toString(2) + " " + value);
        b = b.setBit(1);
        b = b.clearBit(2);
        value = Long.valueOf(b.toString());
        System.out.println(b.toString(2) + " " + value);
    }
}

и вот результат:

1100 12
1010 10

Ответ 4

  • Преобразование long в битовый набор
  • Установите бит, который вам нужен, чтобы
  • Преобразование биттетов в длинный

См. этот пост BitSet для целых и длинных для методов преобразования long в bitet и наоборот

Ответ 5

См. класс java.util.BitSet, который выполняет эту работу для вас.

Чтобы установить: myByte.set(bit); Для reset: myByte.clear(bit); Заполнить bool: myByte.set(bit, b); Чтобы получить bool: b = myByte.get(bit);