为什么在清除位时必须使用“~”运算符?

13 浏览
0 Comments

为什么在清除位时必须使用“~”运算符?

这个问题已经有了相应的答案:

如何设置、清除和切换单个位?

例如,如果我想在C中设置y中位置为n的位。

y = y | (1 << n)

但是如果我想删除y中位置为n的位,我必须在二进制AND后使用~操作符。

y = y & ~(1 << n);

我的问题是:为什么我必须使用~操作符?

这是因为结果变成了负数区域吗?

admin 更改状态以发布 2023年5月23日
0
0 Comments

不,~与将数字解释为负数无关:取反运算符~将数字解释为一系列比特模式,然后将其反转(即用0替换1,用1替换0)。事实上,如果将~应用于无符号值,则结果仍然为正数。

请回忆一下,1<表达式产生一个所有零和单个1位于由k指定的位置的比特模式。这是一个比特掩码,可以通过应用OR运算强制将位于位置k的比特设置为1

现在考虑将~应用于它会发生什么:所有的0将变为1,而唯一的1将变为零。因此,结果是适合通过应用AND运算来强制单个位为零的比特掩码。

0
0 Comments

如果您想在从右边数的第三个位置设置一个位:

Y :            01001000
1 << 2 :       00000100
Y | (1 << 2) : 01001100 The | is OR, bits are set to 1 if any is 1.

如果您想要移除该位:

1 << 2 :         00000100
~(1 << 2) :      11111011  The ~ is NOT, bits are inversed
Y :              01001100
Y & ~(1 << 2) :  01001000 The & is AND, bits are set to 1 if both are 1.

我建议您阅读更多关于位运算符的知识。

0