清除一下后为什么必须使用〜运算符?

时间:2018-02-14 18:07:00

标签: c bit

例如,如果我想在位置n(在C中)设置一个位

y = y | (1 << n)

但如果我想删除位置n的y位,我必须在二进制AND之后使用〜运算符。

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

我的问题:为什么我必须使用〜运算符?
这是因为结果变成了负面区域吗?

4 个答案:

答案 0 :(得分:4)

如果你想在右边的第三位设置一点:

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.

我建议您详细了解Bitwise operators

答案 1 :(得分:1)

不,~与将数字解释为负数无关:代字号~运算符将数字解释为位模式,然后将其反转(即将1替换为1和0)零)。实际上,如果将~应用于无符号值,结果将保持为正。

回想一下1 << k表达式在1指定的位置产生全零和一k的模式。这是一个位掩码,可用于通过应用OR运算将位k的位强制为1

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

答案 2 :(得分:0)

~运算符将0的所有0和1以及1的所有1都变为0&#39。为了清除你想要的位置n中的bint,它将全部为1,在第n个位置为零,所以将一个移到第n个位置,~反转所有位。

答案 3 :(得分:0)

1 << n

n==3(仅作为示例)为您提供了一种模式0000000...0001000~否定了一点 模式为11111111....11110111。使用按位AND运算符(&)将 仅将所需位设置为0,所有其他位保持相同的值。它正在使用 事实上,bb & 1 == b

~翻转所有位,它与负数无关。

k - 位

序列的图形表示
pos        k-1 k-2                           0
          +---+---+-------------------+---+---+
1:        | 0 | 0 |        ···        | 0 | 1 |
          +---+---+-------------------+---+---+

pos        k-1 k-2        n   n-1           0  
          +---+---+-----+---+---+---+-----+---+
1<<n      | 0 | 0 | ··· | 1 | 0 | 0 | ··· | 0 |
          +---+---+-----+---+---+---+-----+---+


pos           k-1 k-2     n   n-1           0  
          +---+---+-----+---+---+---+-----+---+
~(1<<n)   | 1 | 1 | ··· | 0 | 1 | 1 | ··· | 1 |
          +---+---+-----+---+---+---+-----+---+