C 机器数 SDUT


Problem Description

计算机中的数据,其本质都是以二进制码存储。计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位构成,每位的取值为0或1。最右端的那1位称为“最低位”;最左端的那1位称为“最高位”。

数字在计算机中的表示方法有原码、反码和补码。

原码:最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其其余位存放该数的绝对值的二进制。

反码:正数的反码与原码相同,负数的反码符号位为1不变,其余各位按位取反(1变0、0变1)

补码:正数的补码与原码相同,负数的补码是在其反码的基础上+1。

本题要求给定一个8位的原码,求出其补码。


Input

第一行一个T(1=<T<=255),表示有T组数据

以下T行,第i(1=<i<=T)行是一个8位的二进制数,表示一个数的原码


Output

对于每行输入的原码,求出它的补码,并在一行中输出。


Sample Input

2
10101010
01010101


Sample Output

11010110
01010101


Hint

输入数据不存在负零,也就是说,输入的原码可能是 00000000 ,不会有 10000000


Source
shining


#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[9];
    //使用字符串储存字符;
    int t,i;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%s",a);
        if (a[0] == '1')
            //先转化为反码,负数需要转化,正数不需要转化;
        {
            for (i = 1; i < 8; i++)
            {
                if (a[i] == '1')
                {
                     a[i] = '0';
                }

                else
                {
                    a[i] = '1';
                }
            }
        }

        if (a[0] == '1')
            //转化为补码,负数需要转化,正数不需要转化;
        {
            for (i = 7; i >= 0 ; i--)
            {
                if (i == 7)
                //对最有一个字符加一;
                {
                    a[i] = a[i] + 1;
                }
                if (a[i] == '2')
                //因为为二进制,所以遇二进一;
                {
                    a[i] = '0';
                    a[i - 1] = a[i - 1] + 1;
                }
            }
        }
        for (i = 0;i < 8;i++)
        {
            printf("%c",a[i]);
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碧羽o(* ̄▽ ̄*)ブ回雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值