请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011
输出:3输入:00000000000000000000000010000000
输出:1输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。提示:
输入必须是长度为 32 的 二进制串 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof
public class Solution {
// you need to treat n as an unsigned value
//位运算无符号右移>>>,有符号右移>>
public int hammingWeight(int n) {
int res = 0;
while(n != 0){
res += n & 1;//如果n&1=1 ,则n二进制最右一位为1
n=n>>>1;//无符号右移,直到n=0
}
return res;
}
public int hammingWeight01(int n) {
int res = 0;
while(n != 0){
res ++;
n=n&(n-1);//高级算法,每次消去最右边1
//(n-1):二进制数字n最右边的1变成0,此1右边的0都变成1
//(n-1)&n:二进制数字n最右边的1变成0,其余不变
}
return res;
}
}
位操作符
- & 与运算
两个位都是 1 时,结果才为 1,否则为 0,如
1 0 0 1 1 &
1 1 0 0 1
················
1 0 0 0 1
- | 或运算
两个位都是 0 时,结果才为 0,否则为 1,如
1 0 0 1 1 |
1 1 0 0 1
···········
1 1 0 1 1
- ^ 异或运算
两个位相同则为 0,不同则为 1,如
1 0 0 1 1 ^
1 1 0 0 1
···············
0 1 0 1 0
- ~ 取反运算
0 则变为 1,1 则变为 0,如
~1 0 0 1 1
···················
=0 1 1 0 0
-
<< 左移运算
向左进行移位操作,高位丢弃,低位补 0,如
int a = 8;
a << 3;
移位前:0000 0000 0000 0000 0000 0000 0000 1000
移位后:0000 0000 0000 0000 0000 0000 0100 0000
-
“>>” 右移运算(一般表示为位运算无符号右移>>>,有符号右移>>)
向右进行移位操作,对无符号数,高位补 0,对于有符号数,高位补符号位,如
unsigned int a = 8;
a >>> 3;
移位前:0000 0000 0000 0000 0000 0000 0000 1000
移位后:0000 0000 0000 0000 0000 0000 0000 0001int a = -8;
a >> 3;
移位前:1111 1111 1111 1111 1111 1111 1111 1000
移位前:1111 1111 1111 1111 1111 1111 1111 1111