翻转第 k 个有效位

Flip the k-th significant bit

我想找到一个更好的方法来实现以下目标:

n = 6
k = 1

Flip the 1st significant bit in 6

Variable      Binary representation      Decimal Representation
       n                        110                           6
m(result)                       010                           2

我想达到与 this wiki 文章

中相同的效果

这是我所做的,但我发现它有点矫枉过正,效率低下:

def toggleKthSignificantBit(self, n, k):
        tmp = list(bin(n)[2:].zfill(3))
        tmp[k-1] = str(int(tmp[k-1]) ^ 1)
        tmp2 = ''.join(tmp)
        print(tmp2)
        return int(tmp2, 2)

IIUC 也许

n ^ 2**(len(bin(n)) - (2 + k))

def toggle_kth_left_to_right(n, k):
    res = n ^ 2**(len(bin(n)) - (2+k))
    return bin(n)[2:], bin(res)[2:]

# toggle_kth_left_to_right(6, 1)
# ('110', '10')

# toggle_kth_left_to_right(6, 2)
# ('110', '100')

# toggle_kth_left_to_right(6, 3)
# ('110', '111')

假设k是位的位置

那么这应该可以解决问题

x=n^(2**k)
bin(x)

附录:如果我们从左边开始计数,那么我们可以执行以下操作

x = n^(2**(int(n).bit_length()-k))
bin(x)

经过一番检查,我找到了解决问题的方法:

不过,我想我找到了一个等效的解决方案:

n ^ (2**(butterfly_rank - k))