Bitwise operations in Python?

John Machin sjmachin at lexicon.net
Thu Aug 18 20:02:55 EDT 2005


Carl wrote:
> Dear friends,
> 
> I am currently porting a fortran program to Python but am stuck on the
> intrinsic IBITS function. 
> 
> Does anyone know about a replacement function for IBITS in Python?
> 
> Yours, Carl
> 
> IBITS(I, POS, LEN)
> 
> Extracts a sequence of bits.
> 
> I
>     must be of type integer.
> 
> POS
>     must be of type integer. It must be nonnegative and POS + LEN must be
> less than or equal to BIT_SIZE (I).
> 
> LEN
>     must be of type integer and nonnegative. 
> 
> Class
> 
> Elemental function
> 
> Result Type and Attributes
> 
> Same as I.
> 
> Result Value
> 
> The result has the value of the sequence of LEN bits in I beginning at bit
> POS, right-adjusted and with all other bits zero.
> 
> The bits are numbered from 0 to BIT_SIZE(I)-1, from right to left.
> 
> Examples
> 
> IBITS (14, 1, 3) has the value 7. 
> 

No, don't know, but you could write one yourself PDQ. Something like this:

def ibits(arg, pos, len):
     return (arg >> pos) & ((1 << len) - 1)

if __name__ == "__main__":

     def testit(arg, pos, len, reqd):
         result = ibits(arg, pos, len)
         print arg, pos, len, reqd, result, "* "[result == reqd]

     testit(14, 1, 3, 7)
     for pos in range(6):
         testit(4095, pos, 3, 7)
     for pos in range(6):
         testit(-1, pos, 3, 7)
     for pos in range(6):
         testit(0, pos, 3, 0)
     for pos in range(0, 32, 4):
         testit(0x12345678, pos, 4, 8-pos/4)
     for pos in range(0, 32, 4):
         testit(0x87654321, pos, 4, 1+pos/4)



More information about the Python-list mailing list