integer.bitcount()告诉我们的java api:
" public static int bitcount(int i)
返回指定INT值的两者补充二进制表示中的一位数。此功能有时称为人口计数。
返回: 指定int值的两者补充二进制表示中的一位数量。自从: 1.5"
因此,如果我们服用255并将其转换为二进制文件,我们将获得11111111。如果我们将其转换为两者的补充版本,我们将获得00000001,将其数量为一位。但是,如果我运行此代码:
import java.lang.*;
public class IntegerDemo {
public static void main(String[] args) {
int i = 255;
System.out.println("Number = " + i);
/* returns the string representation of the unsigned integer value
represented by the argument in binary (base 2) */
System.out.println("Binary = " + Integer.toBinaryString(i));
/* The next few lines convert the binary number to its two's
complement representation */
char[] tc= Integer.toBinaryString(i).toCharArray();
boolean firstFlipped = true;
for (int j = (tc.length - 1); j >= 0; j--){
if (tc[j] == '1'){
if(firstFlipped){
firstFlipped = false;
}
else{
tc[j] = '0';
}
}
else {
tc[j] = '1';
}
}
// Casting like this is bad. Don't do it.
System.out.println("Two's Complement = " + new String(tc));
System.out.println("Number of one bits = " + Integer.bitCount(i));
}
}
我得到了这个输出:
数字= 255
二进制= 11111111
两个的补充= 00000001
一个位的数量= 8
为什么我得到8而不是1?
两者的补体代表是关于负数的。两个正数的补充表示是该数字本身。
例如,Integer.bitCount(-1)
返回32,因为-1
的两个补体表示为所有1
s的值(其中32个用于int
)。
,但255不是一个负数,因此其两个的补充表示是255本身(其表示中具有8 1
s)。
,因为8是11111111中的位数。