例如,如果我想在位置n(在C中)设置一个位
y = y | (1 << n)
但如果我想删除位置n的y位,我必须在二进制AND之后使用〜运算符。
y = y & ~(1 << n);
我的问题:为什么我必须使用〜运算符?
这是因为结果变成了负面区域吗?
答案 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,所有其他位保持相同的值。它正在使用
事实上,b
:b & 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 |
+---+---+-----+---+---+---+-----+---+