为什么在清除1 × 0后,它在位掩码中返回1



看,在这个问题中,我想要清除第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

如果n4而不是5,那么结果将是0而不是1

clear_bit返回1,因为求值的结果是1

让我们看一下你的例子。

n = 5的二进制是101

clear_bit执行以下操作:

  • 创建mask=~(1 << i)i = 2,这意味着这产生~(0b100),即0b1111...1011
  • maskn(如上所述,是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"

最新更新