将范围拆分为可以进行位掩码的部分

时间:2012-08-16 18:06:12

标签: algorithm

我有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)

我该怎么做呢?不是语言特定的,只需要一些想法。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]