如何在Python中操作位?

时间:2008-09-29 06:31:27

标签: python

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

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

我如何在Python中做到这一点?

9 个答案:

答案 0 :(得分:48)

Python内联的按位操作与C中的操作非常相似.Python中的&|^运算符就像在C中一样。~运算符用作对于C中的有符号整数;也就是说,~x计算-x-1

你必须要小心左移,因为Python整数不是固定宽度。使用位掩码来获得低位。例如,要做相当于32位整数的移位,请(x << 5) & 0xffffffff

答案 1 :(得分:11)

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

答案 2 :(得分:4)

你还应该看看BitArray,这是处理比特序列的一个很好的接口。

答案 3 :(得分:4)

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

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:3)

Python有C风格的位操作运算符,因此除了没有类型关键字之外,你的例子在Python中几乎相同。

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

答案 7 :(得分:0)

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

 import math
 class BitVector:
     def __init__(self,val):
         self._val = val

     def __setslice__(self,highIndx,lowIndx,newVal):
         assert 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)

     def __getslice__(self,highIndx,lowIndx):
         return (self._val>>lowIndx)&(2L**(highIndx-lowIndx+1)-1)

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

 for i in xrange(0,16,4):
     print '%X'%b[i+3:i]

输出:

 D
 E
 A
 D

答案 8 :(得分:0)

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)