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

时间:2018-02-16 19:27:01

标签: java bit-manipulation bitvector

我正在试验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中设置为1的所有32位的值是什么?

添加了countSetBits函数:

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

3 个答案:

答案 0 :(得分:1)

值如MSDN - UInt32.MaxValue Field

所述
  

此常数的值为4,294,967,295;
  也就是十六进制0xFFFFFFFF。

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

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

  • -1用于签名的32位integer
  • 4,294,967,295表示无符号32位integer

答案 1 :(得分:1)

您可以切换所有位" 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
  3. Ideone demo

答案 2 :(得分:1)

正如其他人已经注意到的那样,-1是对这个32位有符号整数的正确解释。这是因为这是两个补码表示法,其中0到2 ^ 31-1(包括)的位模式是正的,而位模式2 ^ 31到2 ^ 32-1(包括)被视为消极的。这些负数实际上是给定的数字加上2 ^ 32。因此,将所有32位设置为1的数字等于-1。