~ 按位取反运算解析

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Coder__CS/article/details/79186677

今天我在看简明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的博客

展开阅读全文

没有更多推荐了,返回首页