The Java API for Integer.bitCount() tells us:
"public static int bitCount(int i)
Returns the number of one-bits in the two's complement binary representation of the specified int value. This function is sometimes referred to as the population count.
Returns: the number of one-bits in the two's complement binary representation of the specified int value. Since: 1.5"
So if we take 255 and convert it to binary, we get 11111111. If we convert that to the two's complement version we get 00000001, making the number of one-bits one. However, if I run this code:
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));
}
}
I get this output:
Number = 255
Binary = 11111111
Two's Complement = 00000001
Number of one bits = 8
Why am I getting 8 instead of 1?
Two's complement represenation is about negative numbers. Two's complement representation of a positive number is that number itself.
For example, Integer.bitCount(-1)
returns 32, because two's complement representation of -1
is a value with all 1
s (32 of them for int
).
But 255 is not a negative number, therefore its two's complement representation is the value 255 itself (that has 8 1
s in its representation).