• Python学习中的“按位取反”笔记总结


    | 疑惑

      最近在学习Python的过程中了解到位运算符,但对于按位取反有点迷糊,就比如说~9(按位取反)之后的结果是-10,为什么不是6呢?所以下面就来看看为什么不是6,正确结果是如何计算出来的呢?

      敲重点:二进制数在内存中以补码的形式存储!!!

        

    那么上面那句话有两个关键词,我们先来看看"二进制数"

    | 二进制数
      按位取反是位运算符,而位运算符是应用在两个数的运算上,会对数字的二进制所有位数进行从低到高的运算。

      所以我们需要把十进制数转换成二进制数再进行运算,但补码又是什么呢?

     

    | 补码

      补码是属于计算机三种机械数的一种,机械数有原码、反码、补码。

      如果是正数,那么原码 = 反码 = 补码,正数的符号位为0(如 0 1001,这里的0就是符号位,负数类似);

      如果是负数,那么反码就是把原码的每一位取反,也就是0变成1,1变成0;补码就是在反码的基础上,末位+1,负数的符号位为1。

    | 解题过程

      所以这样子,我们再来看回原题,~9 = -10是怎样出来的呢?

      首先,第一步,把十进制数转化成二进制数;(即1001(2)

      第二步,由于二进制数在内存中以补码的形式存储,所以我们需要把第一步得到的二进制数转成补码,要成补码先要把原码转成反码(即0 1001,正数原反补一样,为啥四位变五位了呢?第一个0就是我们刚刚提到的符号位啦),然后反码得到补码(即0 1001,正数原反补一样);

      第三步,终于进行按位取反啦!把第二步得到的补码进行按位取反(即1 0110);

      第四步,把第三步的操作转为补码(因为敲重点:二进制数在内存中以补码的形式存储!!!,所以就需要把取反后的二进制数,转成补码),但是由于按位取反后变为负数,所以我们需要应用负数的原反补规则,先变成反码(即1 1001),然后反码末位+1得到补码(即1 1010);

      第五步,所以我们把第四步得到的补码转成十进制数就是结果啦(1010转为十进制就是10,然后符号位是1,故~9结果为-10)。

     

    | 总结规律

      通过这么复杂的步骤是不是觉得有点麻烦呢?

      总结规律!!!快速又便捷:

      ~x = -(x+1)

      大家可以试试是不是这个规律呢?

    ———————————————————————————————————————

    以上为仅为个人总结观点,如果有错误,请联系我进行修改(mailto:entireyu@qq.com),十分感谢您能够看完!

    有疑问,欢迎在评论区评论哦。

    转载请标明出处,本文链接:https://www.cnblogs.com/jniantic/p/12189648.html

    有一份光,发一份热
  • 相关阅读:
    HDU 4565 So Easy!(公式化简+矩阵)
    CentOS 64位下安装Postfix+Dovecot 配置邮件server笔记
    TreeView 高速单击时不运行AfterCheck时间
    小强的HTML5移动开发之路(19)——HTML5 Local Storage(本地存储)
    小强的HTML5移动开发之路(18)——HTML5地理定位
    小强的HTML5移动开发之路(17)——HTML5内联SVG
    小强的HTML5移动开发之路(16)——神奇的拖放功能
    小强的HTML5移动开发之路(15)——HTML5中的音频
    小强的HTML5移动开发之路(14)——Video标签详解
    小强的HTML5移动开发之路(13)——HTML5中的全局属性
  • 原文地址:https://www.cnblogs.com/jniantic/p/12189648.html
Copyright © 2020-2023  润新知