如何在Python中操作位?

42

在 C 语言中,我可以这样将一个 32 位无符号值中的第10位清零:

unsigned long value = 0xdeadbeef;
value &= ~(1<<10);

我该如何在Python中实现这个功能?

9个回答

59

Python整数的位运算与C语言类似。Python中的&|^运算符与C语言中的作用相同。而~运算符则与C语言中的有符号整数一样,即~x计算结果为-x-1

需要注意左移操作,因为Python整数宽度不固定。可以使用位掩码获取低位比特。例如,执行相当于32位整数左移的操作,可使用(x << 5) & 0xffffffff


17
value = 0xdeadbeef
value &= ~(1<<10)

12

以下是一些常见的位运算,它们可能作为示例:

def get_bit(value, n):
    return ((value >> n & 1) != 0)

def set_bit(value, n):
    return value | (1 << n)

def clear_bit(value, n):
    return value & ~(1 << n)

例如用法。

>>> get_bit(5, 2)
True
>>> get_bit(5, 1)
False
>>> set_bit(5, 1)
7
>>> clear_bit(5, 2)
1 
>>> clear_bit(7, 2)
3

5

您还应该查看BitArray,这是一个很好的界面,用于处理位序列。


5

Python具有C风格的位操作符,因此您的示例在Python中实际上是相同的,只是没有类型关键字。

value = 0xdeadbeef
value &= ~(1 << 10)

4
省略掉"unsigned long",也不需要分号:

value = 0xDEADBEEF
value &= ~(1<<10)
print value
"0x%08X" % value

3
如果您需要进行大量的位操作(并且您非常关注应用程序的可读性而不是性能),则可以创建整数包装器以启用类似于Verilog或VHDL中的切片。这里提供了一个示例代码,它使用BitVector类实现了这样的功能。您可以看到,在代码中有__setslice__和__getslice__两个函数,分别用于设置和获取位值。在此之后,代码会输出所需的结果。

很棒的解决方案!您可以考虑将其添加为 pip 包。但是请注意,它仅适用于 Python 2。(这是有道理的,因为它已经超过10年了...) - Zvika

3

你尝试过将代码复制粘贴到Python REPL中查看结果吗?

>>> value = 0xdeadbeef
>>> value &= ~(1<<10)
>>> hex (value)
'0xdeadbaef'

3
a = int('00001111', 2)
b = int('11110000', 2)
bin(a & b)[2:].zfill(8)
bin(a | b)[2:].zfill(8)
bin(a << 2)[2:].zfill(8)
bin(a >> 2)[2:].zfill(8)
bin(a ^ b)[2:].zfill(8)
int(bin(a | b)[2:].zfill(8), 2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接