2010-07-06 83 views

回答

36

这是按位否定。这意味着它会在数字的每一位执行二进制NOT运算符。例如:

int x = 15; // Binary: 00000000 00000000 00000000 00001111 
int y = ~x; // Binary: 11111111 11111111 11111111 11110000 

当加上&操作者它用于清除位。因此,在您的示例中,这意味着var2+7结果的最后3位设置为零。

正如在评论中指出的,它也被用来表示析构函数,但在你的例子中不是这种情况。

+8

+1正确答案。 只是想指出'〜'也被用来命名析构函数。 – ereOn 2010-07-06 14:17:54

+1

并且通常用于形成位掩码。 – 2010-07-06 14:18:34

+0

非常感谢。你很好地清除了我。 – Swiss 2010-07-06 14:26:32

2

7的二进制是00000111,所以〜7是11111000(假设是一个8位字节)。代码作者正在使用它进行位掩码。

+3

它可能不是位掩码 - 它可能只是四舍五入到最近的8位(出于某种原因)。 – corsiKa 2010-07-06 14:19:04

+0

这不仅仅假设一个8位字节,而是一个1字节的'int',这对任何符合标准的C编译器都是错误的假设。 – sepp2k 2010-07-06 14:19:56

+2

我想他只是想避免写太多的二进制数字,并在同一时间通过示例解释不操作。然而,非八位字节可能存在,所以他只是指定例子是在一个字节上做出的,并且该字节有8位。 – ShinTakezou 2010-07-06 14:25:14

3

这是一个按位不是。不要与逻辑不相混淆(这是!),它会翻转逻辑值(true为false,反之亦然)。该运算符翻转变量中的每一位。

4

此代码将var1舍入为最接近的n * 8数字。 &〜7将最后3位设置为0,舍入到8 * n。

1

如上所述,代码的作用是将值四舍五入为八的更高倍数。我的首选公式是“var1 =(var2 | 7)+1;”但要理解的表达作为写入,这是最有帮助的从外向内理解。

虽然“&”和“〜”是单独的运营商,具有不同的优先级的规则,执行“的概念= B &〜Ç ;”是非常有用的一个,它在真正的意义上值得自己的操作符(它会允许更合理的整数提升规则等)。基本上,“a = b &〜c;”用来取消'b'中'c'中的任何位(如果'b'长且'c'不是,由于整数提升规则,它也取消了更高的位)。如果'c'是2^N-1,则表达式将抵消底部的N位,这相当于向下舍入到2^N的下一个倍数。

写入的表达式在将结果舍入到8的下一个倍数之前将var2加7。如果var2是8的倍数,则加7将不会完全达到8的下一个更高倍数,否则它会。因此,整个表达式将四舍五入到8的下一个倍数。

顺便说一下,我的首选公式将数字四舍五入到数字的下一个较高的值,该值刚好小于8的倍数,然后将其颠倒为下一个倍数。它避免了重复的魔术数字“7”,并且在一些指令集中该方法将节省代码。