欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

输出二进制补码

程序员文章站 2022-07-03 07:59:16
描述输入一个整型(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

相关标签: OJ.noi