Count how many 1 in binary representation of a 32-bit integer.
Example
Given 32, return 1
Given 5, return 2
Given 1023, return 9
问题不难,通过位运算(位移+位与)即可得到结果,需要注意的是细节:
符号数的表示,负数的表示。负数的情况下,由于符号位的存在,如果对 signed int 进行位右移运算,符号位会一直存在,数字最后无法变成0,会导致死循环。
二进制的转换成16进制的符号表示,是4个二进制位换算成一个16进制位,1000 0000 --> 0X80,需要注意。
Java 和 C 的数据类型不同,C 可以转换成 unsigned int,Java 没有 unsigned int。不过,突然想到 Java 中存在 unsigned shift >>>,不妨一试。
C 语言版:
int countOne(int num) {
unsigned u = (unsigned) num;
int counter = 0;
while (u) {
if(u & 0x1) {
counter++;
}
u = u >> 1;
}
return counter;
}
Java 版一(去除符号位版)
public int countOnes(int num) {
boolean isNegative = false;
if (num<0) {
isNegative = true;
num = num ^ 0x80000000;
}
int bitCount = 0;
while(num != 0) {
if((num & 0x1) == 1) {
bitCount++;
}
num = num>>1;
}
if(isNegative) bitCount++;
return bitCount;
}
Java unsigned shift version:
public int countOnes(int num) {
int bitCount = 0;
while(num != 0) {
if((num & 0x1) == 1) {
bitCount++;
}
num = num>>>1; // unsigned shift
}
return bitCount;
}