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 }