Problem J: 二进制补码

"
Time Limit $1$ 秒/Second(s) Memory Limit $512$ 兆字节/Megabyte(s)
提交总数 $263$ 正确数量 $125$
裁判形式 标准裁判/Standard Judge 我的状态 尚未尝试
难度 分类标签 字符串 模拟

计算机补码:

(1)输入是一个32位二进制整数每一位是0/1

(2)如果一个数第一位是0表示是非负数,只要把这个转化为十进制就可以了

(3)否则就是对应的绝对值的反码加1,

请根据一个数的补码计算出这个数的值

比如 

11111111 11111111 11111111 11111110(10) =-2(10)

00000000 00000000 00000000 00000110  (10)=6(10)


多组输入,每行32个0或者1表示的字符串,
对于每一组输入,输出对应的有符号的十进制数
11111111111111111111111111111110
-2

原码求补码

编辑
求给定数值的补码分以下两种情况:
正数
正整数的补码是其二进制表示,与原码相同 [3]
例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)

负数

求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1 [4]  。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
例:求-5的补码。
-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的补码是11111011。

0的补码

数0的补码表示是唯一 [3]
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000

补码求原码


已知一个数的补码,求原码的操作其实就是对该补码再求补码 
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
例:已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;再加1,所以是10000111。

意义


补码“模”概念的引入、负数补码的实质、以及补码和真值之间的关系所揭示的补码符号位所具有的数学特征,无不体现了补码在计算机中表示数值型数据的优势,和原码反码等相比可表现在如下方面 [3]
(1)解决了符号的表示的问题 [3]
(2)可以将减法运算转化为补码的加法运算来实现,克服了原码加减法运算繁杂的弊端,可有效简化运算器的设计 [3]
(3)在计算机中,利用电子器件的特点实现补码和真值、原码之间的相互转换,非常容易 [3]
(4)补码表示统一了符号位和数值位,使得符号位可以和数值位一起直接参与运算,这也为后面设计乘法器除法器等运算器件提供了极大的方便。总之,补码概念的引入和当时运算器设计的背景不无关系,从设计者角度,既要考虑表示的数的类型(小数、整数、实数和复数)、数值范围和精确度,又要考虑数据存储和处理所需要的硬件代价。因此,使用补码来表示机器数并得到广泛的应用,也就不难理解了。 [3]