[Tutor] operators >> and &

spir denis.spir at free.fr
Sat Feb 13 23:17:27 CET 2010


On Sat, 13 Feb 2010 13:58:34 -0500
David Abbott <david at pythontoo.com> wrote:

> I am attempting to understand this little program that converts a
> network byte order 32-bit integer to a dotted quad ip address.
> 
> #!/usr/bin/python
> # Filename : int2ip.py
> 
> MAX_IP = 0xffffffffL
> ip = 2130706433
> 
> def int2ip(l):
>     if MAX_IP < l < 0:
>         raise TypeError, "expected int between 0 and %d inclusive" %
> MAX_IP
>     return '%d.%d.%d.%d' % (l>>24 & 255, l>>16 & 255, l>>8 & 255, l &
> 255)
> 
> result = int2ip(ip)
> print result
> 
> I don't understand the l>>24 & 255. 
> 
> from the docs;
> Right Shift a >> b rshift(a, b)
> Bitwise And a & b and_(a, b)
> 
> thanks
> 

In addition to Steve's excellent explanation:
Shifting to the left n bits is equivalent to multiplying by 2^n. Shifting to the right n bits is equivalent to dividing by 2^n. Shifting to the right 8 bits is thus equivalent to dividing by 2^8=256; which means making each octet (in a long integer) one level less significant.
AND-ing is equivalent to masking (this is actually called a mask operating) all bits wich are not 1 in the mask. So AND-ing with 11111111=255 masks all bits except the ones of the least significant octet.
If you represent a 32-bit integer as 4 octets, or 8 hex digits, the picture is easier to catch:
n = 0x12345678		# 0x12345678 = abcd (b=0x34=52)
# to get b:
temp = n >> 16		# 0x00001234 = 00ab
b = temp & 255		# 0x00000034 = 000b

You can perform the same operation without bit-level operators, using modulo and integer division. To understand this, again consider the "abcd" representation: this means a 32-bit integer can be seen as 4-digit number written in base 256 (yes!). Division by 256^n gets rid of n lowest digits, moving down all other ones. Modulo 256^n gets rid of digits in higher position than n. (This may help and fully catch the sense of "base n").
n = 0x12345678		# 0x12345678 = abcd (b=0x34)
# to get b:
temp = n // (256**2)	# 0x00001234 = 00ab
b = temp % 256		# 0x00000034 = 000b

(examples untested)
Bit operations are by far faster, indeed. 


Denis
________________________________

la vita e estrany

http://spir.wikidot.com/


More information about the Tutor mailing list