2013-02-08 81 views
0
if (~mask == 0){...} 

我在.cpp文件中遇到过这种情况,我想知道c/C++中有什么意思?摆动标志在c/C++中意味着什么?

+2

它被称为代字号。 http://en.wikipedia.org/wiki/Tilde#Computer_languages – Tim 2013-02-08 17:42:31

+2

如果您不熟悉按位操作,那么这是一个开始阅读的好地方。 – Mysticial 2013-02-08 17:42:36

回答

8

这是一个tilde,在C++中它意味着bitwise NOT

对于命名mask用下面的位表示的八位无符号整数:

0010 1100 

~mask值:

1101 0011 

注意如何将所有的位被翻转。

为了您if条件(~mask == 0)评估为true:

~mask: 0000 0000 
mask: 1111 1111 

在这种情况下,mask的值为255

适当地将相同的逻辑应用于不同比特宽度和符号的整数。

注:在现实中,如果你的系统有32位int S,~mask将是32位,即使mask是8位。这是因为~执行积分的推广不过,我。忽略这一事实为上述简单的例子)


这里的正式定义:

[C++11: 5.3.1/10]:˜的操作数应具有整型或无限型枚举类型;结果是它的操作数的补码。完成促销活动。结果的类型是提升操作数的类型。有一个在一元表达式˜X(),其中X类名decltype说明符歧义。歧义被解决,有利于将˜作为一元补语而不是将˜X称为析构函数。

由于通道提醒我们,不要混淆位NOTthe leading character in the name of a class destructor。有趣的是,~被选为析构函数;可以说是因为人们可以将构造函数的析构函数看作是相反的(即逻辑而不是)。

4

这是一个按位不是。它反转变量的所有位。 在这种情况下,如果“mask”的所有位都是1,那么if将成立。

+1

不错的答案。我可能只是建议包含一些关于按位操作的背景知识的链接。 – jpm 2013-02-08 17:43:48

1

这就是所谓的按位补运算符在C.

它反转(促进)操作数的所有位( 0成为1,并且1成为0)。

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

该检查,如果的所有mask比特被设置为1

0

它的位不是....它给出给定数字的二进制表示的补码! 如果你写了 b =(〜a); 和a等于说11的二进制表示是0000 1011 ...它会给出 ... b = 1111 0100二进制