Есть много способов сделать это.
Допустим, у вас есть это двоичное значение:
x = 01110110
Как человек, мы можем определить его «обратное» как:
y = 10001001
Теперь давайте посмотрим его свойства:
- Каждый бит
y
не совпадает с соответствующим битом в x
- Эта операция выполняется в C следующим образом:
y = ~x;
- В качестве альтернативы мы знаем, что один бит xor 1 дает не этот бит, поэтому
y = x^0xFF;
- Сумма любого бита плюс его не 1, без переноса. Поэтому
y+x == 0xFF
- Следовательно,
y = 0xFF-x;
Что касается того, почему ваша программа не работает, давайте продолжим цикл:
loop: 0
mask: 0000 0011
temp: 0000 0010
inverse_mask: 0000 0010
loop: 1
mask 0000 0011
temp 0000 0001
inverse_mask: 0000 0011
inverse_mask eventually: 0xFF
Вы могли видеть проблему в самом первом цикле: у вас на втором месте стоит inverse_mask
, которого у вас не должно быть.
Если вы хотите, чтобы temp
содержал только перевернутый бит, вы должны были написать в flibBit
вместо:
return x ^ mask;
эта строка:
return (x & mask) ^ mask;
Чтобы вы сначала изолировали бит, а затем перевернули его.
Я объяснил, чтобы вы узнали об ошибке в своей программе, вам все равно следует использовать один из методов, которые я упомянул первым.