翻转位而不会得到负数

Zen*_*h19 3 ruby bit-manipulation

如何在不改变符号的情况下翻转整数的位?例如,我如何翻转"1010"(10 10)到"0101"(5 10)?

按位操作者否定结果负数:~10(~0b1010)→ -11(0b0101).

Ste*_*fan 9

您可以通过XOR翻转位:

    1010 (decimal 10)
XOR 1111 (decimal 15)
  = 0101 (decimal 5)
Run Code Online (Sandbox Code Playgroud)

在Ruby中:

0b1010 ^ 0b1111 #=> 5
Run Code Online (Sandbox Code Playgroud)

1的数量对应于位数,因此您可以使用:

num  = 0b1010
num ^ (1 << num.bit_length) - 1
#=> 5
Run Code Online (Sandbox Code Playgroud)