1、为什么要提出原码、反码、补码?
由来:解决计算机的计算问题!计算机里面没有减法!
例子:
+5的原码:00000101
-5的原码: 10000101
原码直接相加等于: 10001010 ,结果是-10,显然是不正确的!
2、定义
正数的原码=反码=补码
负数的反码,符号位不变,其余位取反;反码加1得到补码
所以,计算规则变成了:正数+负数 -> 正数的补码+负数的补码
3、实战例子
给任何一个数字,问这个数字的二进制数中有几个1?
代码如下:
#include <iostream>
using namespace std;
const int N = 1e5 + 10; // 定义数组最大长度
int a[N]; // 全局数组,存储输入数据
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
int res = 0; // 计数器,记录每个数的二进制中1的个数
// 遍历数组中的每个数
for (int i = 0; i < n; i++)
{
while(a[i])
{
// 关键操作:a[i] & (\~a[i] + 1) 获取最低位的1
a[i] = a[i] - (a[i] & (\~a[i] + 1)); // 消去最低位的1
res++; // 计数器加1
}
cout << res << ' '; // 输出当前数的二进制中1的个数
res = 0; // 重置计数器
}
return 0;
}
注意:
不论是8位还是16位还是32位,最高位都是符号位,其余位才是数字。
比如八位:第八位是符号位,剩余七位表示数字范围:-127~127