如何复制最后的X位?

时间:2010-07-11 00:33:50

标签: python binary bit-manipulation

假设我有两个带有以下二进制表示的整数:

01101010
00110101

现在我想复制第一个整数的最后3位而不是第二个整数,以便它变为

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 个答案:

答案 0 :(得分:8)

根据您的python版本,表达二进制文字的方式发生变化,请参阅this question for the details

我正在使用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.

我在最后一句中没有理解你的目标,所以我不知道如何解决这个问题:)

答案 1 :(得分:2)

根据Stephen的回答(upvote他),解决方案是:

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)