[Tutor] trying to understand pattern matching code

Alan Gauld alan.gauld at btinternet.com
Sat Apr 26 10:58:56 CEST 2014


On 26/04/14 09:36, rahmad akbar wrote:

> but  i still couldnt get this line though
>
> D = (( D << 1) + 1) & masks [ c ]

Do you understand the concept of bit shifting?
ie
000110 shifted left gives
001100

and
000110 shifted right gives
000011

In other words the bit pattern moves left or
right and the missing bits are replaced with
zeros.

The effect of shift left is to multiply the
number by two.

+ 1 just adds 1 to the resulting number

So the first bit of your line is the same as

D = ((D*2)+1)

The second part uses bitwise and with a mask chosen from a list of masks,
A bitwise and has the effect of zeroing any bit that is zero in the mask 
and keeping any bit that is one in the mask.

So

11100011  -> My data
00001111  -> my mask, designed to return the right hand 4 bits
00000011  -> data & mask

Similarly
11100011  -> data
11110000  -> mask for leftmost 4 bits
11100000  -> data & mask

So which bits are preserved in your D after the math and masking depends 
on what the masks[c] mask looks like.

You might want to use some print statements using the bin()
function to see the actual bit patterns. (If you do you might
find that long bit patterns don;t show what you expect, if
that happens try masking the result to say 16 places
like this:

print bin(mydata & 0xFFFF)  # FFFF => 1111111111111111

HTH
-- 
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.flickr.com/photos/alangauldphotos



More information about the Tutor mailing list