python中什么是按位取反_Python十进制数的取反运算

python中什么是按位取反_Python十进制数的取反运算_第1张图片

本学期四年制初中6年级信息技术教材增设了Python语言编程课,在准备课程时遇到了一个有趣的问题:Python语言有6个位运算符用于对二进制数值运算,包括“&、|、^、~、<<和>>”。其中的取反运算“~”让人难以理解!比如:a=60,在数学中,a的相反数是-60。而在计算机中:~a得到的值是 -61?!这是为什么?查看《C程序设计》(潭浩强著)和《C程序设计及其应用》(徐继扬著)等论述位运算的相关论著,只看到了对二进制的求反运算实例,没有十进制数的取反举例。在网上查看了部分老师的贴子,除了内容完全相同的,部分内容不同的帖子所表述的方法、理论相差稍多。且与上述两本论著的相关论述有少许出入。这更让人难以选择。经过反复研究、测算、对比,对此内容稍有所得,现作如下推论,欢迎指正。计算机中数的存储是以补码形式存放的,现在的计算机一般不用原码和反码进行运算,因为原码和反码在运算中要单独处理其符号。为了能做到将符号位和其它位统一处理,对减法也按加法来处理。这就要用到补码(参考潭浩强著《C程序设计》P256)。正数的补码与原码相同!负数的补码是在原码的基础上,除符号位外其余各位逐位取其反码,即将0变1,1变为0,然后加1取得的(参考徐继扬著《C程序设计及其应用》P20)。二进制数补码最左边的高位是符号位,0为正数,1为负数。计算机运算时先将十进制数转换为补码,用补码对数值进行运算,运算完成后再将补码转换为十进制数显示出来。比如对60取反,先把60变为二进制数:这是正数的补码0011 1100,然后对这个二进制数按位取反得到1100 0011;请注意这是一个负数,且是负数的补码。那么1100 0011这个负数的原码是什么呢?我们按照上一段表述的方法逆向处理:先将补码1100 0011减0000 0001变成反码1100 0010,再对符号位外的数值按位取反得到其原码10111101。这就是我们对60取反得到的数-61,其中最左边高位的1表示负数。再如对50取反,先把50变为二进制数的补码:0011 0010,然后对这个二进制数按位取反得到1100 1101;这是个负数的补码。我们要把它变为原码:先减0000 0001得到反码:1100 1100,再对符号位外的数值位按位取反得到其原码1011 0011。这就是我们对50取反得到的数-51。其中最左边高位的1表示负数。

我们再来看看对负数取反的情况:-30的二进制数原码是:1001 1110,对符号位外的数值按位取反得到反码1110 0001,再加0000 0001得到它的补码1110 0010,对这个补码按位取反得到0001 1101,请注意这是一个正数,是正数的补码,正数的补码与原码相同,因此可直接将这个二进制数转换为十进制数29。

再如对-10取反:-10的二进制数原码:1000 1010,对符号位外的数值位按位取反得到反码1111 0101,再加0000 0001得到它的补码1111 0110,对这个补码按位取反得到0000 1001,请注意这是一个正数,是正数的补码,正数的补码与原码相同,因此可直接将这个二进制数转换为十进制数9。

综上所述:对一个正数求反,要注意将其二进制数按位取反后得到的负数补码转换为负数反码,再转换为负数的原码,再将这个负数的原码变为十进制数。

对一个负数求反,要注意先将负数的二进制数值转换为补码再取反!用代数式~a=-(a+1)=-61表示。

请注意:

1、负数的原码与反码之间的按位取反运算符号位不变,只对符号位外的数值位取反。

2、负数补码与正数补码之间的按位取反运算符号位同时改变。

你可能感兴趣的:(python中什么是按位取反)