编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-1-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解一、将数值与1进行&运算,可得最后一位是否1,若为1,进行记数,并右移,否则直接右移。
①可按位数限制,Java中int类型为32位,可将各位均进行比较,代码如下。
- class Solution{
- public int hammingWeight(int n){
- int count = 0;
- for(int i = 0; i < 32; i++){
- count += n & 1;
- n >>= 1;
- }
- return count;
- }
- }
②可按位进行逻辑右移(>>>,最高位补0),当数据的值为0时,退出while,即可得到1的数量。
(>>算数右移,最高位用符号位补,负数补1,正数补0)
- class Solution{
- public int hammingWeight(int n){
- int count = 0;
- while(n != 0){
- count += n & 1;
- n >>>= 1;
- }
- return count;
- }
- }
题解二、使用(n & ( n - 1))可将末尾的1消除为0,数据进行-1后,最低位的1变为0,后面的0变为1,所以(n-1)与n进行&操作,最低位1以及之后的数据均变为0。
详见【负雪明烛】详解位运算,附本题躲坑指南 - 位1的个数 - 力扣(LeetCode)
统计变为全0进行的次数即可。
- class Solution{
- public int hammingWeight(int n){
- int count = 0;
- while(n != 0){
- n &= (n - 1);
- count++;
- }
- return count;
- }
- }