取反运算是编程中常用的位运算操作
python中获取二进制数
- 在python中,使用bin()可以快速获得数值对应的二进制数
>>> bin(1024)
'0b10000000000' # 输出结果
- 在python中,取反操作符是~
- 示例
a = 5
print(~a)
放到python中运行,输出的结果竟然是-6,这就有点难理解了,十进制数字5按4位二进制数表示为0101,取反后的值是1010,对应的十进制数为10,并不是运算结果-6,那么这是怎么回事呢?在这里就需要复习一些概念,原码、反码、补码。
原码和反码
原码和反码是非常好理解的,比如上面提到的原码0101对应的反码就是1010,按位取反即可
补码
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
- 补码的符号
在补码中,最左侧的数字是符号位,0代表+,1代表-,比如0101对应的数字一定是正数,而1010则是负数 - 补码的求法
- 正整数的补码和原码相同
- 负整数的补码,将其对应的正数二进制表示的所有位取反(0变1,1变0,符号位为1不变)后加1。-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)。所以-5的补码是11111011。
- 0的补码是唯一的,[+0]补=[+0]反=[+0]原=00000000;[ -0]补=11111111+1=00000000
- 已知补码求原码
- 如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
- 如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
比如我们这里最初要解决的问题就变成了,已知一个数x的补码为1010,求这个数。首先符号数为1,表示负数,所以该位不变,其余数值取反,变为--->1101,然后再加1,----> 1110,这里的1110转换为带符号十进制数为-6,也就是我们看到的运算结果了。
总结
计算机中使用补码表示数值,正数的补码是它本身,负数的补码是它对应正数取反后加1,注意符号位保持不变
计算公式:~a = -(a+1)
版权属于:妙数网
本文链接:https://www.mioshu.com/archives/297.html
转载声明:本文为原创内容,著作权归 妙数网 所有,转载时请注明出处!