翻转第 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))
我想找到一个更好的方法来实现以下目标:
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))