Скажем, у меня есть целое число, например 10101
, я хотел бы отключить третий бит, чтобы получить 10001
; если у меня 10001
, я все равно получаю 10001
; как я могу это достичь?
unset(int i, int j)
int i= 10101 or 10000
int j = 00100
Скажем, у меня есть целое число, например 10101
, я хотел бы отключить третий бит, чтобы получить 10001
; если у меня 10001
, я все равно получаю 10001
; как я могу это достичь?
unset(int i, int j)
int i= 10101 or 10000
int j = 00100
Предполагая, что вы индексируете биты справа, это должно работать, чтобы отменить определенный бит в value
:
int mask = 1 << bitIndex;
value &= ~mask;
Вы можете установить бит с помощью аналогичного кода:
value |= mask;
где mask
по-прежнему. (Это предполагает, что индексирование бит начинается с нуля)
Чтобы очистить или отключить бит
Используйте побитовый оператор И (&), чтобы очистить бит.
number &= ~(1 << x);
Это очистит бит x. Вы должны инвертировать битовую строку с побитовым оператором NOT (~), затем AND it.
ПРИМЕЧАНИЕ: здесь x - позиция бит, начинающаяся от 0 до LSB.
Если вы имеете дело с литрами, то вы можете просто работать с шестнадцатеричными числами. Преобразование ваших битовых шаблонов в шестнадцатеричные числа:
10101 => 0x15
00100 => 0x04
Таким образом, следующий код C установил бы b
на нужный результат.
int a = 0x15;
int b = a & ~( 0x04 );
Если вы хотите что-то общее, у вас может быть функция C (при удалении всей проверки диапазона), например
int clearBit( int value, int bit )
{
// Assume we count bits starting at 1
return value & ~( 1 << (bit -1) );
}
Вы можете переключить n-й бит
result = number ^ (1 << bitIndex)
В C и C++ используйте бит-мудрый оператор AND для формирования маски И:
10101 & 10001
В Java:
int num = 0b10101;
int mask = 1 << bitPosition;
System.out.println(Integer.toBinaryString(num));
num &= ~mask;
System.out.println(Integer.toBinaryString(num));