如何复制最后X位?

2 投票
2 回答
4322 浏览
提问于 2025-04-16 01:06

假设我有两个整数,它们的二进制表示如下:

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 个回答

2

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

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)
8

根据你使用的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.

我不太明白你最后一句话的意思,所以不知道该怎么回答你 :)

撰写回答