1360:二进制补码
难度: 秩序白银 时间限制: 1000MS 空间限制: 64MB 提交数: 93 通过数: 30题目内容
题目描述:
在计算机系统中,数值一律用补码(two's complement)来表示和存储
原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
补码的第一位也是符号位,对正数来说,补码和原码的形式一样.对负数来说,
负数的补码相当于把它的原码除了符号位以外取反(即1变成0,0变成1)然后再加1
例如,我们用8位二进制表示一个数,+11的补码为00001011,-11的补码就是11110101
现在,假设我们采用8位二进制来表示补码,根据输入的整数n,输出其对应的补码表示
输入描述:
多组输入,每组输入一个整数n,占一行,-128<=n<=127
输出描述:
输出n的8位二进制补码表示
样例输入:
127
-1
样例输出:
01111111
11111111
样例解释
127是正数,所以它的补码和原码一样
-1是负数,它的原码是10000001,除符号位取反后是11111110,然后再加1的结果就是11111111
#include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { int j = 7, a[8] = {0}; int temp = n; if (temp < 0) { //假如为负数 a[0] = 1; temp = -temp; } while (temp != 0) { //原码 a[j--] = temp % 2; temp = temp / 2; } if (n < 0){ for (int i = 1; i <= 7; i++) //按位取反 a[i] = (!a[i]); a[7] = a[7] + 1;//最后一位加1 for (int i = 7; a[i] == 2; i--) { //如果加1后等于2 则改成0 a[i] = 0; if (i - 1 != 0) //-128是特例 a[i-1] += 1; } } for (int i = 0; i <= 7; i++) //输出 printf("%d", a[i]); printf("\n"); } return 0; }