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