Способ инвертирования двоичного значения целочисленной переменной

У меня есть это целое число 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