题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
#include<iostream>
using namespace std;
int numof1(int n) {
unsigned int flag = 1;
int count = 0;
while (flag) {//0为false 非0为true
if (n & flag) {
count++;
}
flag = flag << 1;
}
return count;
}
int main() {
int n;
cin >> n;
int ans = numof1(n);
cout << ans << endl;
return 0;
}
一.移位运算
1.左移运算符m<<n:把m左移n位,最左边n位抛弃,最右边补上n个0。
00001010<<2=00101000
10001010<<3=01010000
2.右移运算符m>>n:把m右移n位,最右边n位抛弃。
如果m是无符号数,最左边补上n个0;如果m是有符号数,用数字的符号位填补n位。
以有符号数位例:
00001010>>2=00000010
10001010>>3=11110001
3.移位运算比乘除运算效率更高:从效率上看,使用移位指令有更高的效率,因为移位指令占2个机器周期,而乘除法指令占4个机器周期;从硬件上看,移位对硬件更容易实现。
二.与或运算
从低位开始与或
1001&1110=1000
1001&1=1
三.其他
1.sizeof(int)=sizeof(unsigned int)=4(字节)
2.计算机中数字用补码存储。
3.补码解决了加减法的问题和两个0的问题。
1-1=1+(-1)=(0000 0001)原 +(1000 0001)原 =(1000 0010)原=-2
1-1=1+(-1)=(0000 0001)反 +(1111 1110)反 =(1111 1111)反=(1000 0000)原=-0
1-1=1+(-1)=(0000 0001)补 +(1111 1111)补 =(0000 0000)补=(0000 0000)原=0//解决了加减法
-1-127=(-1) + (-127) = (1111 1111)补 + [1000 0001]补 = [1000 0000]补=-128 没有原码和反码能表示//解决了两个0,可以多表示一个数
4.int类型的取值范围:-2^31~2^31-1 十六进制表示——0x8000 0000~0x7FFF FFFF