【算法】补码反码

求一个数二进制表示中含1的个数

#include
#include

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

在线原码/反码/补码计算器

你可能感兴趣的:(c++)