在 C 语言中,我可以这样将一个 32 位无符号值中的第10位清零:
unsigned long value = 0xdeadbeef;
value &= ~(1<<10);
我该如何在Python中实现这个功能?
在 C 语言中,我可以这样将一个 32 位无符号值中的第10位清零:
unsigned long value = 0xdeadbeef;
value &= ~(1<<10);
我该如何在Python中实现这个功能?
Python整数的位运算与C语言类似。Python中的&
、|
和^
运算符与C语言中的作用相同。而~
运算符则与C语言中的有符号整数一样,即~x
计算结果为-x-1
。
需要注意左移操作,因为Python整数宽度不固定。可以使用位掩码获取低位比特。例如,执行相当于32位整数左移的操作,可使用(x << 5) & 0xffffffff
。
value = 0xdeadbeef
value &= ~(1<<10)
以下是一些常见的位运算,它们可能作为示例:
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
Python具有C风格的位操作符,因此您的示例在Python中实际上是相同的,只是没有类型关键字。
value = 0xdeadbeef
value &= ~(1 << 10)
value = 0xDEADBEEF
value &= ~(1<<10)
print value
"0x%08X" % value
你尝试过将代码复制粘贴到Python REPL中查看结果吗?
>>> value = 0xdeadbeef
>>> value &= ~(1<<10)
>>> hex (value)
'0xdeadbaef'
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)
pip
包。但是请注意,它仅适用于 Python 2。(这是有道理的,因为它已经超过10年了...) - Zvika