您的位置:首页 > 其它

~ 按位取反运算解析

2018-01-28 14:39 232 查看
今天我在看简明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)
,至于这个公式怎样推理出来的,这里不作介绍,有兴趣的可以上网冲浪查询。懂原理才能记得牢固,一个快捷计算公式只是为了计算时方便。

转载请注明出处:http://blog.csdn.net/coder__cs/article/details/79186677

本文出自【elon33的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: