if (~mask == 0){...}
我在其中一个 .cpp 文件中遇到过这个问题,我想知道 ~ 在 c/c++ 中是什么意思?
mask
对于使用以下位表示命名的八位无符号整数:
0010 1100
的值为~mask
:
1101 0011
注意所有位是如何翻转的。
让您的if
条件 ( ~mask == 0
) 评估为真:
~mask: 0000 0000
mask: 1111 1111
在这种情况下,mask
具有价值255
。
酌情将相同的逻辑应用于不同位宽和符号的整数。
(注意:实际上,如果你的系统是32位int
的,~mask
即使mask
是8位也是32位的。这是因为~
执行积分提升。但是,对于上面的简单示例,我忽略了这个事实。)
这是正式的定义:
[C++11: 5.3.1/10]:
的操作数˜
应具有整数或非范围枚举类型;结果是其操作数的反码。进行整体促销。结果的类型是提升的操作数的类型。unary-expression 中存在歧义˜X()
,其中X
是class-name或decltype-specifier。歧义得到解决,有利于将˜
其视为一元补码,而不是˜X
视为指代析构函数。
正如这段话提醒我们的那样,不要将按位 NOT与类析构函数名称中的前导字符混淆。有趣的是,它~
被选为析构函数;可以说这是因为人们可以将析构函数视为构造函数的相反(即逻辑NOT)。
有点不是。它反转变量的所有位。在这种情况下,如果“掩码”的所有位均为 1,则您的 if 将为真。
它在 C中称为按位补码运算符。
它反转(提升)操作数的所有位(a0
变为 a1
并且 a1
变为 a 0
)。
if (~mask == 0){...}
这将检查是否所有位mask
都设置为1
。
(它被称为“波浪号”。)
它的按位不是......它给出了给定数字的二进制表示的补码!就像你写 b=(~a); 并且 a 等于说 11 其二进制表示为 0000 1011 ...它会以二进制形式给出 ...b=1111 0100