这段代码中~0是什么意思?

时间:2010-06-08 17:09:03

标签: c++

此代码中〜0的含义是什么? 有人可以为我分析这段代码吗?

unsigned int Order(unsigned int maxPeriod = ~0) const
{
    Point r = *this;
    unsigned int n = 0;
    while( r.x_ != 0 && r.y_ != 0 )
    {
        ++n;
        r += *this;
        if ( n > maxPeriod ) break;
    }
    return n;
}

8 个答案:

答案 0 :(得分:25)

~00的按位补码,它是一个填充了所有位的数字。对于无符号的32位int,即0xfffffffff的确切数量取决于您为~0指定的值的大小。

答案 1 :(得分:17)

它是一个补码,它反转所有位。

 ~  0101 => 1010
 ~  0000 => 1111
 ~  1111 => 0000

答案 2 :(得分:9)

正如其他人所提到的,~运算符执行按位补码。但是,对标志值执行操作的结果不是由标准定义的。

特别是,~0的值不必是-1,这可能是预期的值。将默认参数设置为

unsigned int maxPeriod = -1

会使maxPeriod包含最高可能值(签名为无符号转换定义为赋值模2**n,其中n是给定无符号类型的特征数(数字)代表性的比特))。

另请注意,默认参数在C中无效。

答案 3 :(得分:4)

这是一个二元补充函数。

基本上它意味着翻转每一位。

答案 4 :(得分:4)

它是0的按位补码,在这个例子中,是一个int,所有位都设置为1.如果sizeof(int)是4,那么数字是0xffffffff。

答案 5 :(得分:3)

基本上,它说maxPeriod的默认值为UINT_MAX。作者不是将其写成UINT_MAX,而是使用他对补语的知识来计算价值。

如果您希望将来的代码更具可读性,请添加

#include <limits>

并将调用更改为读取

unsigned int     Order(unsigned int maxPeriod = UINT_MAX) const

现在解释为什么~0是UINT_MAX。因为我们正在处理一个int,其中0表示所有零位(00000000)。添加一个会给(00000001),再添加一个会给(00000010),还有一个会给(00000011)。最后再添加一个(00000100),因为1是随身携带。

对于无符号整数,如果重复进程ad-infiniteum,最终会得到所有的一位(11111111),并且添加另一个将溢出缓冲区设置所有位回零。这意味着无符号数中的所有位都是数据类型(在您的情况下为int)可以容纳的最大值。

“〜”操作将所有位从0翻转为1或1翻转为0,翻转零整数(具有全零位)有效地为您提供UINT_MAX。所以他基本上以前的编码选择了计算机UINT_MAX而不是使用#include <limits.h>中的系统定义副本

答案 6 :(得分:0)

在示例中,可能是尝试生成UINT_MAX值。由于已经陈述的原因,该技术可能存在缺陷。

然而,表达式确实有合法的用途来生成一个位掩码,所有位都使用与类型宽度无关的文字常量设置;但这不是你的例子中使用它的方式。

答案 7 :(得分:0)

正如其他人所说,〜是按位补码运算符(有时也称为按位运算符)。它是一元运算符,意味着只需要一个输入。

按位运算符将输入视为位模式,并对每个位执行各自的操作,然后返回结果模式。将〜运算符应用于位模式将取消每个位(每个零变为1,每个变为零)。

在您给出的示例中,整数0的位表示全为零。因此,~0将产生所有1的位模式。即使0是int,也是分配给maxPeriod的位模式~0(不是由所述位模式表示的int值)。由于maxPeriod是一个无符号的int,因此它被赋予了由~0(所有1的模式)表示的unsigned int值,这实际上是unsigned int在回绕到0之前可以存储的最高值。