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)

どうすればこれを行うことができますか?言語固有ではなく、いくつかのアイデアが必要です。

4

2 に答える 2

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]
于 2012-08-17T16:20:15.267 に答える
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
于 2012-08-16T20:00:59.397 に答える