0
if (~mask == 0){...}

我在其中一个 .cpp 文件中遇到过这个问题,我想知道 ~ 在 c/c++ 中是什么意思?

4

5 回答 5

8

它是一个波浪号,在 C++ 中它表示按位 NOT

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(),其中Xclass-namedecltype-specifier。歧义得到解决,有利于将˜其视为一元补码,而不是˜X视为指代析构函数。

正如这段话提醒我们的那样,不要将按位 NOT与类析构函数名称中的前导字符混淆。有趣的是,它~被选为析构函数;可以说这是因为人们可以将析构函数视为构造函数的相反(即逻辑NOT)。

于 2013-02-08T17:42:41.780 回答
4

有点不是。它反转变量的所有位。在这种情况下,如果“掩码”的所有位均为 1,则您的 if 将为真。

于 2013-02-08T17:42:59.177 回答
1

它在 C中称为按位补码运算符。

它反转(提升)操作数的所有位(a0变为 a1并且 a1变为 a 0)。

if (~mask == 0){...}

这将检查是否所有位mask都设置为1

于 2013-02-08T17:44:03.667 回答
0

这是按位不运算。

(它被称为“波浪号”。)

于 2013-02-08T17:43:41.860 回答
0

它的按位不是......它给出了给定数字的二进制表示的补码!就像你写 b=(~a); 并且 a 等于说 11 其二进制表示为 0000 1011 ...它会以二进制形式给出 ...b=1111 0100

于 2013-02-08T18:09:07.910 回答