补码转原数值公式(非常简单实用的公式)

补码转原数值公式:~x = -(x+1)

左边的x指计算机中的二进制补码,右边的x是实际的数值。
正数的补码就是它本身,很简单,现在详细讲一下负数的补码怎么计算这个数的值。
下面说一下这个公式怎么用。(以下计算全部以一个字节为例)

例1. 计算-1的补码对应的原数值:

-1的原码是1000 0001
-1的反码是1111 1110
-1的补码是1111 1111
当我们只知道一个二进制字符串是某个数x的补码时,我们要怎么计算这个数x的值呢?
接下来就可以用上面这个公式了。
首先将x的补码1111 1111进行取反,则变成了0000 0000,这时候,公式的左边就求出来了,而0000 0000这个数是0,所以-(x+1)就是等于0, 所以就可以知道x-1了。这就完成了通过x的补码1111 1111求出x的值为2了。

例2. x的补码为1111 1110,这个数x的值是多少?

首先将补码每一位全部取反,得到0000 0001, 等式左边这个值~x 的值为1, 所以等式右边 -(x+1)的值也为

### 关于码、反码、补码和移码的计算公式 #### 码 对于一个n位二进制数,其最高位作为符号位(0代表正数,1代表负数),其余各位表示数值部分。例如,8位二进制数`0000 0010`表示十进制中的+2;而`1000 0010`则表示-2。 #### 反码 - 正数的反码码相同。 - 负数的反码是在保持符号位不变的情况下,将其余各位置按位取反得到的结果。比如,给定一个8位二进制形式下的-2(`1000 0010`),它的反码就是`1111 1101`[^4]。 #### 补码 - 对于正数而言,补码等于该数本身; - 若为负数,则先求得此数对应的反码之后再加上1即为其补码。继续以上述例子(-2),已知其反码为`1111 1101`,那么加上1后的结果便是`1111 1110`,这就是-2在计算机内部存储的形式——补码。 #### 移码 为了便于处理带符号的数据,在某些情况下会使用到移码。具体来说,当涉及到浮点运算时尤为常见。移码可以通过对某个数的补码简单变换获得:即将补码最左侧一位(符号位)进行翻即可得出相应移码。仍以前面提到过的-2为例,它以补码形式呈现出来是`1111 1110`,因此相应的移码就应该是`0111 1110`[^1]。 ```python def get_original_code(value, bits=8): """获取指定值的码""" if value >= 0: return format(value & ((1 << (bits - 1)) - 1), '0{}b'.format(bits)).zfill(bits) else: return "1" + format((abs(value) ^ ((1 << (bits - 1)) - 1)), '0{}b'.format(bits - 1)) def get_complement_one(code_str): """通过传入的字符串参数code_str返回对应的一位反码""" complemented_bits = ''.join(['1' if bit == '0' else '0' for bit in code_str]) return f"{complemented_bits}" def get_two_complement(code_str): """基于输入的一位反码串code_str进一步加工成两位补码""" inverted_bits_with_carry = bin(int(get_complement_one(code_str), base=2)+1)[2:] padded_result = ('{0:0>%d}' % len(code_str)).format(inverted_bits_with_carry)[-len(code_str):] return str(padded_result) def get_offset_binary(two_comp_str): """接受两个补码two_comp_str并生成最终版本的偏置二进制表达方式""" flipped_sign_bit = two_comp_str.replace('1', '_').replace('0', '1').replace('_', '0') return flipped_sign_bit[:1]+two_comp_str[1:] value=-2 original=get_original_code(value) one_complement=get_complement_one(original) two_complement=get_two_complement(one_complement) offset_binary=get_offset_binary(two_complement) print(f"Original Code of {value}: ", original) print("One's Complement:", one_complement) print("Two's Complement:", two_complement) print("Offset Binary:", offset_binary) ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值