二进制中1的个数
一、考点
操作符 左移 << 的使用
操作符 & 的使用
二、考点笔记
1.左移操作符 “<<”
它是对二进制数进行操作的。
将二进制向左边移动一位,右边自动补0。
举例:
如7的二进制为:(一共32位)
00000000000000000000000000000111
对7左移一位:(结果是14)
00000000000000000000000000001110
代码:
int main(){
int a = 7;
a = a << 1;
printf("%d\n",a);
return 0;
}
结果:
14
2.右移操作符 “>>”
右移稍微复杂一点,分为
逻辑右移:不管数的正负,向右移动后自动补0
算术右移 :移动后,正数补0,复数补1(因为它是符号位,0表示负数,1表示正数)
c语言里右移操作是算术右移
举例:(涉及到了整数在内存中的存储方式,这一块不做详解)
-1的二进制为:
10000000000000000000000000000001(原码)
11111111111111111111111111111110(反码)
11111111111111111111111111111111(补码)
右移一位:
11111111111111111111111111111111 (最左边补的是符号位1)
结果 -1
代码
int main(){
int a = -1;
a = a >> 1;
printf("%d\n",a);
return 0;
}
结果:
-1
3.与操作符&
两个整数 用 & 运算:将两个数的二进制(补码)逐位比较,都为1是该位为1,否则为0
举例
7 & 5
7和5的二进制:
00000000000000000000000000000111(7)
00000000000000000000000000000101(5)
结果
00000000000000000000000000000101 (5)
代码:
int main(){
int a = 7;
int b = 5;
int c = a & b;
printf("%d\n",c);
return 0;
}
结果
5
三、题目与解题
题目
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
代码解决
int hammingWeight(uint32_t n) {
unsigned int a = 1;
int count = 0;
for(int i = 1;i <=32;i++){
if(n & a){
count++;
}
a = a << 1;
}
return count;
}