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
,则 integer
值 0xFFFFFFFF
将是
-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
您的 countSetBits
不工作有两个原因:
while (n > 0)
不会以负数 n
循环。将其更改为 n != 0
.
n >>= 1
是带符号的移位:这会在您移位时保留符号位。将其更改为 n >>>= 1
.
正如其他人已经指出的那样,-1 是对此 32 位带符号整数的正确解释。这是因为这是two's-complement表示法,其中bit-patterns0到2^31-1(含)为正数,bit-patterns2^31到2^32- 1(含)被视为阴性。这些负数其实就是给定的数加上2^32。因此,所有 32 位都设置为 1 的数字相当于 -1。
我在 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
,则 integer
值 0xFFFFFFFF
将是
-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
您的 countSetBits
不工作有两个原因:
while (n > 0)
不会以负数n
循环。将其更改为n != 0
.n >>= 1
是带符号的移位:这会在您移位时保留符号位。将其更改为n >>>= 1
.
正如其他人已经指出的那样,-1 是对此 32 位带符号整数的正确解释。这是因为这是two's-complement表示法,其中bit-patterns0到2^31-1(含)为正数,bit-patterns2^31到2^32- 1(含)被视为阴性。这些负数其实就是给定的数加上2^32。因此,所有 32 位都设置为 1 的数字相当于 -1。