按位运算设置负数的第n位

bitwise operation set nth bit for negative number

我正在尝试使用按位运算设置数字的第 n 位。我将第 n 个移位 1(n 是从 0 开始的 LSB 的索引),然后使用 OR 操作来设置第 n 个位。 适用于正数,理论上也适用于负数,因为在 MSB 上与 0 进行或运算应该没有变化。但是当我 运行 在 Python 中执行此操作时,我没有得到想要的结果。

def bitwise_setNthBit(num, n):
  '''
  Check if n th bit is set in the number num or not
  '''
  n_shifted_one = 1<<n
  print(num, bin(num), n_shifted_one, bin(n_shifted_one))
  return num | n_shifted_one

num, n = 10, 2
result = bitwise_setNthBit(num, n)
print('Setting LSB at position {} on {} results in {}'.format(n, num, result))
num, n = -18, 2
result = bitwise_setNthBit(num, n)
print(bin(result))
print('Setting LSB at position {} on {} results in {}'.format(n, num, result))

当使用 -18 作为数字并设置第 2 位时,我得到 -18 在二进制中表示为 -0b10010,1<<2 在二进制中表示为 0b100。当我在这些数字之间进行或运算时,我应该得到 -0b10110 结果,但我得到的是 -0b10010.

I get -18 represented in Binary as -0b10010

小心,负数以一种偷偷摸摸的方式转换为二进制字符串,注意前面的-符号:数字确实是-0b10010而不是0b10010。这意味着实际的位模式是减号后显示的字符串的二进制补码,所以...111101110(extending infinitely far to the left,就像正数的零向左无限延伸一样)。 ORing 与 0b100 不做任何事情,因为该位已经设置。