How do I manipulate bits in Python?

后端 未结 9 1857
借酒劲吻你
借酒劲吻你 2020-12-12 22:37

In C I could, for example, zero out bit #10 in a 32 bit unsigned value like so:

unsigned long value = 0xdeadbeef;
value &= ~(1<<10);
相关标签:
9条回答
  • 2020-12-12 22:52

    You should also check out BitArray, which is a nice interface for dealing with sequences of bits.

    0 讨论(0)
  • 2020-12-12 23:05
    value = 0xdeadbeef
    value &= ~(1<<10)
    
    0 讨论(0)
  • 2020-12-12 23:05

    Python has C style bit manipulation operators, so your example is literally the same in Python except without type keywords.

    value = 0xdeadbeef
    value &= ~(1 << 10)
    
    0 讨论(0)
  • 2020-12-12 23:07

    If you're going to do a lot of bit manipulation ( and you care much more about readability rather than performance for your application ) then you may want to create an integer wrapper to enable slicing like in Verilog or 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]
    

    Outputs:

     D
     E
     A
     D
    
    0 讨论(0)
  • 2020-12-12 23:10
    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)
    
    0 讨论(0)
  • 2020-12-12 23:12

    Bitwise operations on Python ints work much like in C. The &, | and ^ operators in Python work just like in C. The ~ operator works as for a signed integer in C; that is, ~x computes -x-1.

    You have to be somewhat careful with left shifts, since Python integers aren't fixed-width. Use bit masks to obtain the low order bits. For example, to do the equivalent of shift of a 32-bit integer do (x << 5) & 0xffffffff.

    0 讨论(0)
提交回复
热议问题