如何在 Python 中操作位?

问题描述 投票:0回答:9

例如,在 C 中,我可以将 32 位无符号值中的位 #10 清零,如下所示:

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

如何在 Python 中做到这一点?

python
9个回答
59
投票

Python 整数上的按位运算与 C 中的工作方式非常相似。Python 中的

&
|
^
运算符的工作方式与 C 中类似。
~
运算符的工作方式与 C 中的有符号整数相同;也就是说,
~x
计算
-x-1

您必须小心左移,因为 Python 整数不是固定宽度的。使用位掩码获取低位。例如,要执行 32 位整数的移位操作,请执行

(x << 5) & 0xffffffff


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

14
投票

一些常见的位操作可以作为示例:

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
投票

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

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

5
投票

您还应该查看BitArray,这是一个处理位序列的很好的接口。


4
投票

省略“unsigned long”,也不需要分号:

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

3
投票

您是否尝试过将代码复制并粘贴到 Python REPL 中看看会发生什么?

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

3
投票

如果您要进行大量位操作(并且您更关心应用程序的可读性而不是性能),那么您可能需要创建一个整数包装器来启用像 Verilog 或 VHDL 中那样的切片:

 导入数学
 位向量类:
     def __init__(self,val):
         self._val = val

     def __setslice__(自我,highIndx,lowIndx,newVal):
         断言 math.ceil(math.log(newVal)/math.log(2)) <= (highIndx-lowIndx+1)

         # clear out bit slice
         clean_mask = (2**(highIndx+1)-1)^(2**(lowIndx)-1)

         self._val = self._val ^ (self._val & clean_mask)
         # set new value
         self._val = self._val | (newVal<>lowIndx)&(2L**(highIndx-lowIndx+1)-1)

 b = 位向量(0)
 b[3:0] = 0xD
 b[7:4] = 0xE
 b[11:8] = 0xA
 b[15:12] = 0xD

 对于 xrange(0,16,4) 中的 i:
     打印 '%X'%b[i+3:i]

输出:

 D
 乙
 一个
 D

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)
© www.soinside.com 2019 - 2024. All rights reserved.