二进制中 1 的个数

输入一个整数,输出该数二进制表示中 1 的个数。java

 

 

 位与运算技巧:

  • n&(n-1) 去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 获得 10110011,这两个数相与获得 10110000。
  • n&(-n) 获得 n 的位级表示中最低的那一位。-n 获得 n 的反码加 1,对于二进制表示 10110100,-n 获得 01001100,相与获得 00000100。
  • n-n&(~n+1) 去除 n 的位级表示中最高的那一位。

移位运算:spa

  • >> n 为算术右移,至关于除以 2n;
  • >>> n 为无符号右移,左边会补上 0。
  • << n 为算术左移,至关于乘以 2n。

 

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的个数。技巧

相关文章
相关标签/搜索