看,在这个问题中,我想要清除第i_th位,它是1,所以在执行这个方法后,它应该是0,应该返回0,但它不是,应该返回0,而是返回1,我不知道为什么,请解释一下。
int clear_bit(int n, int i)
{
int mask = ~(1 << i);
return ((n & mask));
}
int main()
{
int n = 5;
int i = 2;
cout << clear_bit(5, 2);
return 0;
}
整数5
为二进制0000..00000101
位。
1 << 2
为整数4
,即二进制0000..00000100
位。
将该值与~
反置,创建一个包含1111..11111011
位的掩码。
因此,将n
与掩码进行AND运算,清除第2位,结果为0000..00000001
位,即整数1
。
0000..00000101
& 1111..11111011
----------------
0000..00000001
如果n
是4
而不是5
,那么结果将是0
而不是1
。
clear_bit
返回1
,因为求值的结果是1
让我们看一下你的例子。
n = 5
的二进制是101
clear_bit
执行以下操作:
- 创建
mask
=~(1 << i)
。i = 2
,这意味着这产生~(0b100)
,即0b1111...1011
- 将
mask
与n
(如上所述,是101
)合并,结果为:0b111...1011 & 0b000...0101 -------------- 0b000...0001
唯一设置的共同位是第0位——它将整个表达式求值为1
。因此,1
就是您所看到的结果。
5 xor 2 = 5,因此没有位将改变值。这是预期的
标准库有操作位的代码,你可以考虑使用它。
#include <bitset>
std::bitset<4> bits{"0101"}; // 5
bits.reset(2);
std::cout << bits.to_string() << std::endl; // output "0101"
bits.flip(2)
std::cout << bits_to_string() << std::endl; // output "0111"