【问题标题】:bitwise operation set nth bit for negative number按位运算将第 n 位设置为负数
【发布时间】:2019-10-09 12:21:45
【问题描述】:

我正在尝试使用按位运算设置数字的第 n 位。我得到第 n 个移位 1(n 是从 0 开始的 LSB 的索引),然后使用 OR 操作来设置第 n 位。 适用于正数,理论上也适用于负数,因为在 MSB 上与 0 进行 ORing 应该没有变化。但是当我在 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

【问题讨论】:

    标签: python bit-manipulation bitwise-operators bit-shift bitwise-or


    【解决方案1】:

    我得到 -18 以二进制表示为 -0b10010

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

    【讨论】:

    • 谢谢@harold。这带来了更多的清晰度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-05-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多