2


0

最後のXビットをコピーする方法は?

次のバイナリ表現を持つ2つの整数があるとします。

01101010
00110101

そして今、最初の整数から最後の3ビットを2番目の整数にコピーして、次のようにします。

00110010

最も簡単な方法は何ですか?

(実際、私の目標は、すべてのX + 1ビットを右にシフトし、基本的にX番目のビットを削除し、X-1ビットを同じに保つことです-この場合、Xは4です)

'' '' '

「理由」:

あなたにはたくさんの旗があり、

1 = 'permission x'
2 = 'permission y'
4 = 'permission z'
8 = 'permission w'

プログラムで「許可y」が不要になったと判断したため、zとwを位置をシフトします(それぞれ2と4にします)。 ただし、ここでデータベースのすべての値を更新する必要があります。 (どの式を使用しますか?)

2 Answer


8


使用しているPythonのバージョン、バイナリリテラルの表現方法によって異なります。https://stackoverflow.com/questions/1476/how-do-you-express-binary-literals-in-python [詳細についてはこの質問]をご覧ください。 。

私は2.5.2を使用しているので、これを使用しました:

>>> a = int('01101010', 2)
>>> b = int('00110101', 2)
>>> mask = 07  # Mask out the last 3 bits.
>>> (b & ~mask) | (a & mask)
50
>>> int('00110010', 2)
50

'' '' '

詳細:

(b & ~mask)  <- This keeps the first n-3 bits. (By negating the 3bit mask).
(a & mask)   <- This keeps the last 3 bits.
If you '|' (bitwise OR) them together, you get your desired result.

'' '' '

私は最後の文であなたの目標を理解していなかったので、それに対処する方法がわかりません:)


2


スティーブンの答え(彼に賛成)に基づいた解決策は次のとおりです。

def f(pos, val):
    """
    @pos: the position of the bit to remove
    @val: the value to remove it from
    """
    mask = (1<<(pos-1))-1
    return ((val>>1) & ~mask) | (val & mask)

print f(4, int('01101010', 2)) == int('00110010', 2)