输出二进制补码
程序员文章站
2022-04-08 21:47:04
描述输入一个整型(int)的整数,输出它的32位二进制补码。输入一个整型整数。输出输出一行,即该整数的补码表示。样例输入7样例输出00000000000000000000000000000111知点第一位为符号位,0表示正数,1表示负数;正数的原码,反码,补码相同;负数的反码为各位取反,补码为反码加一;2,原:0010 反:0010 补:0010-2,原:1010 反:1101 补:1110另外0原码是00000000-0原码是10000000...
描述
输入一个整型(int)的整数,输出它的32位二进制补码。
输入
一个整型整数。
输出
输出一行,即该整数的补码表示。
样例输入
7
样例输出
00000000000000000000000000000111
知点
第一位为符号位,0表示正数,1表示负数;
正数的原码,反码,补码相同;
负数的反码为各位取反,补码为反码加一;
2,原:0010 反:0010 补:0010
-2,原:1010 反:1101 补:1110
另外
0原码是00000000 -0原码是10000000
0反码是00000000 -0反码是11111111
0补码是00000000 补码没有正0与负0之分
解题
可以将0纳入不小于0的情况下处理
先将原数转化为二进制并复制到答案中
再根据正负求补码
如果为负数时先转换为反码,再求补码
代码
#include <iostream>
#include <cstring>
using namespace std;
int ans[33], temp[33];
int main() {
memset(ans, 0, sizeof(ans));
memset(temp, 0, sizeof(temp));
int n;
cin >> n;
int flag = (n >= 0) ? 0 : 1;//正负
n = (n >= 0) ? n : -n;
int size = 0;
do {
temp[size++] = n % 2;
n /= 2;
} while (n != 0);//得到二进制
for (int i = 0; i < size; ++i) {//复制到答案数组里
ans[31 - i] = temp[i];
}
if (flag) {//负数情况下
for (int i = 1; i < 32; ++i) {//反码
ans[i] = (ans[i]) ? 0 : 1;
}
for (int i = 31; i > 0; --i) {//补码
if (ans[i] == 1)ans[i] = 0;
else {
ans[i] = 1;
break;
}
}
}
ans[0] = flag;//符号位
for (int i = 0; i < 32; ++i) {
cout << ans[i];
}
return 0;
}
本文地址:https://blog.csdn.net/xcdq_aaa/article/details/107427541