2012-08-16 18 views
0

我有2個任意的16位整數。作爲一個例子:將範圍拆分成可以位掩碼的塊

start: 0010000000000000 (8192) 
end: 1111111111111111 (65535) 

我想分割範圍8192-65535成可以用一個位掩碼錶示的東西。所以在這種情況下,我希望能夠識別:

start: 0001000000000000 (8192) 
end: 0011111111111111 (16383) 

start: 0100000000000000 (16384) 
end: 0111111111111111 (32767) 

start: 1000000000000000 (32768) 
end: 1111111111111111 (65535) 

我該如何去做這件事?不是特定語言,只需要一些想法。

回答

0

假設num總是至少8192 ...

if num & 0xc000 == 0: 
    # bitmask 0xc000 == 1100000000000000 
    # first partition if the first two bits are 0 
elif num & 0x8000 == 0: 
    # bitmask 0x8000 == 1000000000000000 
    # second partition if only the first bit is 0 
else: 
    # third partition 
0

這裏的想法是要找到這是你的低值和高值之間的2^n - 1所有值。這是因爲所有的塊位掩碼(如你之後的類型)的格式爲2^n - 1。下面是一些Python實現是:

def split_range(low, high): 
    yield low 
    for mask in [(1 << k) - 1 for k in xrange(0, 16) if (1 << k) > low and (1 << k) < high]: 
     yield mask 
    yield high 

爲您例如

In [5]: list(split_range.split_range(8192, 65535)) 
Out[5]: [8192, 16383, 32767, 65535]