int 中所有 32 位都设置为 1 的值是多少?

what is the value of all 32 bits set to 1 in int?

我在 java

中试验位运算

我尝试按索引设置位索引,这就是我得到的。 从整数 0 到第 31 位中的第 0 位开始设置(因为 int 最多有 32 位)

value  of0bits set: 1
value  of1bits set: 3
value  of2bits set: 7
value  of3bits set: 15
value  of4bits set: 31
value  of5bits set: 63
value  of6bits set: 127
value  of7bits set: 255
value  of8bits set: 511
value  of9bits set: 1023
value  of10bits set: 2047
value  of11bits set: 4095
value  of12bits set: 8191
value  of13bits set: 16383
value  of14bits set: 32767
value  of15bits set: 65535
value  of16bits set: 131071
value  of17bits set: 262143
value  of18bits set: 524287
value  of19bits set: 1048575
value  of20bits set: 2097151
value  of21bits set: 4194303
value  of22bits set: 8388607
value  of23bits set: 16777215
value  of24bits set: 33554431
value  of25bits set: 67108863
value  of26bits set: 134217727
value  of27bits set: 268435455
value  of28bits set: 536870911
value  of29bits set: 1073741823
value  of30bits set: 2147483647
value  of31bits set: -1

很好!带有位的 int 的值来自 0 到第 31 个索引(最低位到最高位) 都设置好了,结果是 -1 - 从上面的结果

让我试试其他方法:

System.out.println(BitVector.countSetBits( -1 ) )  \ prints '0'

那么int中32位全部设为1的值是多少?

添加了 countSetBits 函数:

   static int countSetBits(int n)
    {
        int count = 0;
        while (n > 0)
        {
            count += n & 1;
            n >>= 1;
        }
        return count;
    }

该值为 MSDN - UInt32.MaxValue Field 中所述:

The value of this constant is 4,294,967,295;
that is, hexadecimal 0xFFFFFFFF.

您一直在使用 Int32(已签名)。因此你在最后一个因素得到了-1

因此,如果所有位都设置为 1,则 integer0xFFFFFFFF 将是

  • -1 有符号 32 位 integer
  • 4,294,967,295 对于无符号 32 位 integer

您可以使用 ~ 运算符切换所有位 "on":

System.out.println(~0);
System.out.println("Number of bits set to 1: " + Integer.bitCount(~0));

打印:

-1
Number of bits set to 1: 32

Ideone demo


您的 countSetBits 不工作有两个原因:

  1. while (n > 0) 不会以负数 n 循环。将其更改为 n != 0.
  2. n >>= 1 是带符号的移位:这会在您移位时保留符号位。将其更改为 n >>>= 1.

Ideone demo

正如其他人已经指出的那样,-1 是对此 32 位带符号整数的正确解释。这是因为这是two's-complement表示法,其中bit-patterns0到2^31-1(含)为正数,bit-patterns2^31到2^32- 1(含)被视为阴性。这些负数其实就是给定的数加上2^32。因此,所有 32 位都设置为 1 的数字相当于 -1。