Count one

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

问题不难,通过位运算(位移+位与)即可得到结果,需要注意的是细节:

  1. 符号数的表示,负数的表示。负数的情况下,由于符号位的存在,如果对 signed int 进行位右移运算,符号位会一直存在,数字最后无法变成0,会导致死循环。

  2. 二进制的转换成16进制的符号表示,是4个二进制位换算成一个16进制位,1000 0000 --> 0X80,需要注意。

  3. 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;
    }

你可能感兴趣的:(Count one)