输入一个整数,输出该数二进制表示中 1 的个数。java
移位运算:spa
public class Solution { public int NumberOf1(int n) { int cnt = 0; //计数器 while (n != 0) { //计数器不等于 0 cnt++; //计数器加一 n &= (n - 1); //若是当前位是1,则计数器加1 } return cnt; } }
这应该是目前的最优解了。code
其复杂度仅仅与给定的数的1的个数有关。io
1111000 - 1 = 1110111class
一个二进制数减1的试过是他全部的1中最低位的1变成0,他后面的0变成1,因此将n&(n-1),就会将最低位的1变位0,不断的循环直到把n中全部的1都替换为0便可。循环
11000101010,须要5此循环。其复杂度O(M),M为给定的数的1的个数。技巧