求一个数二进制表示中含1的个数
#include<iostream>
#include<algorithm>
int main(){
int n,cnt;
scanf("%d",&n);
while(n){
if(n&1==1){ // 最低位为1
cnt++;
}
n=n>>1;
}
printf("%d\n",cnt);
return 0;
}
求一个数二进制表示的第k位是几
n>>(k-1)&1
lowbit运算
返回x二进制中最低位的1和后面的0所组成的十进制数
int lowbit(int x){
return x & -x;
}
负数的二进制表示=补码=反码
补码=反码+1
正数的原码、反码、补码都一样
负数的反码:原码按位取反
在计算机系统中,数值一律使用补码来表示和存储。可以将符号位和数值域统一处理;加法和减法也可以统一处理
反码的求法:符号位不变, 其他位按位取反
二进制编码 | 无符号数 | 有符号数 | 反码 | 补码 |
---|---|---|---|---|
0000 | 0 | 0 | +0 | 0 |
0001 | 1 | 1 | 1 | 1 |
0010 | 2 | 2 | 2 | 2 |
0011 | 3 | 3 | 3 | 3 |
0100 | 4 | 4 | 4 | 4 |
0101 | 5 | 5 | 5 | 5 |
0110 | 6 | 6 | 6 | 6 |
0111 | 7 | 7 | 7 | 7 |
1000 | 8 | -0 | -7 | -8 |
1001 | 9 | -1 | -6 | -7 |
1010 | 10 | -2 | -5 | -6 |
1011 | 11 | -3 | -4 | -5 |
1100 | 12 | -4 | -3 | -4 |
1101 | 13 | -5 | -2 | -3 |
1110 | 14 | -6 | -1 | -2 |
1111 | 15 | -7 | -0 | -1 |
6进行一次lowbit运算得到2,6-2使得最后一位1被剔除
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N=100010;
int n;
int lowbit(int x){
return x&-x;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
while(x){
x-=lowbit(x);
cnt++;
}
}
return 0;
}