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
問題不難,通過位運(yùn)算(位移+位與)即可得到結(jié)果,需要注意的是細(xì)節(jié):
符號(hào)數(shù)的表示,負(fù)數(shù)的表示。負(fù)數(shù)的情況下,由于符號(hào)位的存在,如果對(duì) signed int 進(jìn)行位右移運(yùn)算,符號(hào)位會(huì)一直存在,數(shù)字最后無法變成0,會(huì)導(dǎo)致死循環(huán)。
二進(jìn)制的轉(zhuǎn)換成16進(jìn)制的符號(hào)表示,是4個(gè)二進(jìn)制位換算成一個(gè)16進(jìn)制位,1000 0000 --> 0X80,需要注意。
Java 和 C 的數(shù)據(jù)類型不同,C 可以轉(zhuǎn)換成 unsigned int,Java 沒有 unsigned int。不過,突然想到 Java 中存在 unsigned shift >>>,不妨一試。
C 語(yǔ)言版:
int countOne(int num) {
unsigned u = (unsigned) num;
int counter = 0;
while (u) {
if(u & 0x1) {
counter++;
}
u = u >> 1;
}
return counter;
}
Java 版一(去除符號(hào)位版)
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;
}