#include<stdio.h>
#include<string.h> // 用于strlen校验输入长度
// 二进制字符串加一函数(补码转换需要:反码+1)
void binary_add_one(char *bin) {
int carry = 1; // 初始进位为1(加一)
// 从最低位(第15位)向高位遍历
for (int i = 15; i >= 0 && carry; i--) {
if (bin[i] == '1') {
bin[i] = '0'; // 1+1=0,保持进位
} else {
bin[i] = '1'; // 0+1=1,进位清零
carry = 0;
}
}
}
int main()
{
int i;
char s[17]; // 16位字符 + 字符串结束符'\0',必须留位置
// 读取16位二进制原码字符串(%s读取整串,%c仅读单个字符,原代码错误)
scanf("%s", s);
// 步骤1:判断符号位(s[0]是最高位,原码符号位)
if (s[0] == '0') {
// 正数:原码 = 补码,直接输出
printf("%s\n", s);
} else {
// 负数:原码→补码 = 符号位不变 + 其余位取反 + 整体加1
// 子步骤1:符号位不变,第1~15位按位取反(得到反码)
for (i = 1; i < 16; i++) { // 从第1位开始(跳过符号位)
if (s[i] == '0') {
s[i] = '1';
} else if (s[i] == '1') { // 原代码把'0'/'1'写成0/1,是字符和数字混淆
s[i] = '0';
}
}
// 子步骤2:反码加1(得到补码)
binary_add_one(s);
// 输出补码字符串
printf("%s\n", s);
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复