今天通过一道简单的题目看看位运算到底是个怎么一回事,很多人都不太理解位运算的意义。
在我们cpu计算时,加,减,位运算要比乘除速度快的特别多,其中比较常见的位运算有:&(与) ||(或) ^(异或) 等。
<<左移
· >> 右移
题目描述:
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。
题目示例:
我们看看这道题,以11为例,11的二进制为1011,很明显有3个1。我们的任务就是通过上面提到的几种运算将他们找出来。
很明显只要1和0相与就为0,所以只要11和 一个合适的数相与不为0,就表示该位为1,什么样的数合适呢?
像0000001,0000010,0000100等这种只有一个位置为1,其他位置全为0的数最合适。
- 1011&0001!=0说明第一位为1,此时计数器count=1
- 1011&0010!=0,说明第二位为1,count=2
- 1011&0100=0,说明该位置为0,count不变
- 1011&1000!=0,说明该位置为1,count=3
按照这种方式,很容易找到我们想要的结果,下面就是如何将 0001变为0010->0100->1000
这是很明显的移位运算,将1一直左移即可。
代码如下:
public class Solution {
public int hammingWeight(int n) {
if(n==0)return 0;
int count=0;
for(int i=0;i<32;i++){
if((n&(1<<i))!=0){
count+=1;
}
}
return count;
}
}