📅  最后修改于: 2023-12-03 15:36:50.966000             🧑  作者: Mango
本文介绍如何使用位运算操作来切换数字的第k位。我们先了解一下位运算中的两个操作符:位与(&)和位或(|)。
位与是一种位运算操作符,表示对两个二进制数对应位求与操作。只有当两个对应位均为1时,结果才为1,否则结果为0。
例如,0b1010 & 0b1100 = 0b1000。
位或是一种位运算操作符,表示对两个二进制数对应位求或操作。只要两个对应位中有一个为1,结果就为1,否则结果为0。
例如,0b1010 | 0b1100 = 0b1110。
假设我们有一个数字n和一个数字k(从右侧开始,第一位为1),我们想要将n的第k位从0变成1,或从1变成0。
切换数字的第k位可以使用位异或(^)操作。位异或是一种位运算操作符,表示对两个二进制数对应位求异或操作。只有当两个对应位不同时,结果为1,否则结果为0。
例如,0b1010 ^ 0b1100 = 0b0110。
因此,我们可以先将一个二进制数的第k位设置为1,然后将其与n执行位异或操作,这样就可以将n的第k位从0变成1,或从1变成0。
下面是切换数字的第k位的代码实现:
def toggle_bit(n, k):
# 将1左移k-1位,得到一个只有第k位为1的二进制数
mask = 1 << (k - 1)
# 将n的第k位与上面的二进制数做位异或,即可切换第k位
return n ^ mask
这个函数接受两个参数:一个整数n和一个整数k。它返回一个整数,表示切换了n的第k位之后的结果。
我们可以使用下面的测试用例来验证这个函数的正确性:
assert toggle_bit(0b1010, 2) == 0b1110
assert toggle_bit(0b1101, 3) == 0b1001
这个测试用例分别测试了将0b1010的第2位(从右往左数)从0变成1,以及将0b1101的第3位从1变成0的情况。因为两个测试用例都通过了,所以我们可以认为这个函数的实现是正确的。