Leet Code之Number of 1 bits

常规方法,一位一位右移,算出1的个数。但是最大的数有32个1,需要右移32次,效率较低。

常规方法:

 1 int hammingWeight(uint32_t n) {
 2     int k,num;
 3     num = 0;
 4     while(n!=0)
 5     {
 6         k = n%2;
 7         if(k)num++;
 8         n = n>>1;
 9     }
10     return num;
11 }

效率较高方法:通过将n与n-1进行与操作,进行与的次数即为1的个数。

道理很简单,每次与操作会消除n的一个"1",消除完的时候就是1的个数了。

具体的,对一个数而言,有两种情况:一种是n的末尾是1,那么n-1的末尾就是0,进行的与操作消除了这个末尾的1,例如111和110,结果为110,只有两个1了;

第二种是末尾是0,高位出现的第一个1会被消除,例如n是11000,n-1就是10111,与操作就会消除这个1,结果为10000。

 1 int hammingWeight(uint32_t n) {
 2     int k,num;
 3     num = 0;
 4     while(n!=0)
 5     {
 6         n = n&(n-1);
 7         num++;
 8     }
 9     return num;
10 }

 

posted @ 2015-03-26 14:14  Sprink  阅读(136)  评论(0编辑  收藏  举报