Как установить/отключить бит в определенной позиции длинной?
Как установить/отключить бит в определенной позиции длинного в Java?
Например,
long l = 0b001100L ; // bit representation
Я хочу установить бит в позиции 2 и установить бит в позиции 3, таким образом, будет длинным будет
long l = 0b001010L ; // bit representation
Может кто-нибудь помочь мне, как это сделать?
Ответы
Ответ 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);