📌  相关文章
📜  通过将所有位翻转到最右边的设置位的左侧而形成的数字(1)

📅  最后修改于: 2023-12-03 14:58:05.676000             🧑  作者: Mango

通过将所有位翻转到最右边的设置位的左侧而形成的数字

在编程中,有时需要操作二进制数,而其中一个经典问题就是找到一个二进制数中最右侧的设置位,然后将这个位及其右侧的所有位翻转过来,形成一个新的二进制数。这个新的二进制数是什么呢?就是将所有位翻转到最右侧的设置位的左侧而形成的数字。

实现思路

假设要操作的二进制数为n,我们需要找到最右侧的设置位,也就是找到最右侧的1。可以通过n & -n来实现,这个操作可以得到n的补码中最右侧的1所对应的值。

接下来,将这个值左移一位,并将左移后的值减去1,这个操作可以得到一个二进制数,它的最低位是1,其他位都是0。将这个二进制数与n进行按位异或,就可以得到将所有位翻转到最右侧的设置位的左侧而形成的数字。

以下是Python代码的实现:

def flip_bits(n: int) -> int:
    right_most_set_bit = n & -n
    flip_mask = (right_most_set_bit << 1) - 1
    return n ^ flip_mask
示例

假设n的二进制表示为0b101110101,那么它的最右侧的设置位是第1位(从右往左数),将它及其右侧的所有位翻转过来得到的二进制数是0b101110110,转换成十进制数就是186

>>> flip_bits(0b101110101)
186

又如,假设n的二进制表示为0b10101100,那么它的最右侧的设置位是第2位(从右往左数),将它及其右侧的所有位翻转过来得到的二进制数是0b10101011,转换成十进制数就是171

>>> flip_bits(0b10101100)
171
总结

通过将所有位翻转到最右侧的设置位的左侧而形成的数字,是一个经典的编程问题,也是操作二进制数时的一个常见需求。实现思路比较简单,但需要一定的位运算技巧。