Способ инвертирования двоичного значения целочисленной переменной
У меня есть это целое число int nine = 9;
, которое в двоичном формате 1001
. Есть ли простой способ инвертировать его, чтобы я мог получить 0110
?
Ответы
Ответ 1
int notnine = ~nine;
Если вас беспокоит только последний байт:
int notnine = ~nine & 0x000000FF;
И если вас интересует только последний кусок:
int notnine = ~nine & 0x0000000F;
Оператор ~ - это побитовое отрицание, в то время как маска дает вам только байт/полубайт, о котором вы заботитесь.
Если вас действительно интересует только последний кусок, простейший самый:
int notnine = 15 - nine;
Работает на каждый кусок.: -)
Ответ 2
Для этого существует оператор, ~
.
nine = ~nine;
Ответ 3
Если мы рассматриваем 9 как целое число, подобное этому:
00000000000000000000000000001001
и вы хотите:
00000000000000000000000000000110
вместо:
11111111111111111111111111110110
И позаботьтесь больше, чем последний полубайт (например, также хотите обрабатывать 128903).
Затем вы можете создать маску и применить ее:
uint value = 9; //or try 1290320
uint mask = 0;
for (int i = 1; i <= 16; i *= 2)
mask |= mask >> i;
value = mask & (~value);
Вы можете ускорить это, используя измененную версию http://en.wikipedia.org/wiki/Find_first_set или используя инструкцию bsf asm.
Ответ 4
Эта проблема не полностью задана - вам всего лишь 4 бита, или ответ должен соответствовать количеству значимых бит на входе? Если это последний, вам понадобится сложная манипуляция с битами для маскировки верхних бит.
Я немного изменю Bit Twiddling Hack, чтобы создать маску.
int mask = num;
mask |= mask >> 1;
mask |= mask >> 2;
mask |= mask >> 4;
mask |= mask >> 8;
mask |= mask >> 16;
int inverse = ~num & mask;
Смотрите в действии: http://ideone.com/pEqwwM
Ответ 5
1) Создайте маску для последних n бит, которые вы хотите перевернуть
mask = (1<<n) - 1
2) используйте xor
a ^ mask
Кроме того, если вы хотите перевернуть биты, начиная с первого в двоичном представлении, вы можете сделать это
n = 0; while ((1<<n) <= a) n++;
Ответ 6
Используйте xor с 111111....
var inverted = a ^ int.MinValue