#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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论