今天我在看简明Python指南的时候,看到其中一个计算机计算的问题,它是这样描述的:
x的按位取反结果为-(x+1) ~5 输出 -6。有关本例的更多细节可以参阅:http://stackoverflow.com/a/11810203
看到这儿我就疑惑了,之前在大学中学习的计算机基础课程又还给教材了,hhh… 无奈,我只好取网上搜寻解析的答案,而网上的解释说得不太让人明白,自己结合他人的解释进行了一番整理,把思路排版出来,供后来者参阅:
首先要明确的一点是,计算机内部在做数学运算时(也就是计算机的0和1的运算),都是以补码为标准的,说白了 计算机中就一种码那就是补码,而现实社会中的编码规则,例如原码、反码都是我们自定义的,为了和计算机中的补码形成转换关系。所以说在我们手工计算这类由计算机计算的01运算,要站在计算机的角度。因此首先就要将我们的原码反码什么的全都先转为补码,再来计算_。这样才能使得正数和负数的表示统一起来,具体可以参阅【补码的历史】,这里不过多展开了。 接着来看那个问题,从问题入手,解决了实际问题,概念也就自然了然于心了。_
5的补码是它本身(ps:正数的原、反、补码都是它本身;负数的原码最高为为1开头,反码是最高符号位不变,其余位在原码的基础上取反,补码是在反码的基础上+1即可得到)
5的补码:00000101
~5
(也就是5按位取反运算,下面涉及的是补码运算):
00000101
按位取反,这里需要将原始01串完全反转过来,不存在最高符号位的概念,取反结果为: 11111010
注意这里的结果是用补码表示的,毕竟这还是机器表示形式,转化为自然语言的编码,把结果转化为原码就是:
补码-1转为反码: 11111010 - 1 = 11111001
反码再取反转为原码:11111001
= 10000110
原码转为十进制,答案就是-6
按位取反的快捷运算公式 -(x+1)
,至于这个公式怎样推理出来的,这里不作介绍。
关于~x=-(x+1)的证明,有兴趣的可以看看这篇:https://www.cnblogs.com/zjutzz/p/10646760.html。懂原理才能记得牢固,一个快捷计算公式只是为了计算时方便。
转载请注明出处:http://blog.csdn.net/coder__cs/article/details/79186677 本文出自【elon33的博客】
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170466.html原文链接:https://javaforall.cn