我有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 :(得分: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]