我正在试验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;
}
答案 0 :(得分:1)
值如MSDN - UInt32.MaxValue Field:
所述此常数的值为4,294,967,295;
也就是十六进制0xFFFFFFFF。
您一直在使用Int32
(已签名)。因此,你在最后一个因素得到-1
。
因此,如果所有位都设置为1
,则integer
值0xFFFFFFFF
将为
-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
countSetBits
由于两个原因而无效:
while (n > 0)
不会以负n
循环。将其更改为n != 0
。n >>= 1
已签名移位:这会在您移位时保留符号位。将其更改为n >>>= 1
。答案 2 :(得分:1)
正如其他人已经注意到的那样,-1是对这个32位有符号整数的正确解释。这是因为这是两个补码表示法,其中0到2 ^ 31-1(包括)的位模式是正的,而位模式2 ^ 31到2 ^ 32-1(包括)被视为消极的。这些负数实际上是给定的数字加上2 ^ 32。因此,将所有32位设置为1的数字等于-1。