zoukankan      html  css  js  c++  java
  • python-1:Number数字类型 之二 相关函数 int.from_bytes,int.to_bytes()

    函数格式int.from_bytes(bytes, byteorder, *, signed=False)
    简单demo:
    [python] view plain copy
    1. <code class="language-python">s1 = b'xf1xff'  
    2. print(int.from_bytes(s1, byteorder='big', signed=False))  
    3. print(int.from_bytes(s1, byteorder='little', signed=True))  
    4. </code>  
     
    输出:61951
              -15
    参数解释bytes是要转换的十六进制;
    byteorder:选'big'和'little',以上例为例,其中big代表正常顺序,即f1ff。little反之,代表反序fff1;
    signed:选True、Flase表示是否要区分二进制的正负数含义。即是否要对原二进制数进行原码反码补码操作。
    在分析demo的转换原理前我们首先要知道原码、补码、反码的知识:
    原码:为了表示负数.(改变开头位数字表示正负,1为负,0为正)
              我们都知道1的二进制数为0001,那-1呢?为了表示负数,规定了如果开头那个数字如果是1就代表负数,即-1的二进制
              数原码为1001
    反码:为了处理负数.(将负数的原码除了开头位全部由0变1或者由1变0)
              我们都知道1+(-1)=0,但是二者的二进制数 0001+1001=1010,结果是-2,这不是我们想要的,所以出现了反码
              反码,顾名思义就是“反着来”,把0变成1,1变成0,反的是负数的原码,即-1的反码 1001 变成了1110。
              这时候1+(-1)-> 0001 +1110=1111,再将结果1111从反码返回成原码即1000(-0),就是我们希望得到的数0.
              注意:负数原码最开头表示数字正负的那个数字位 ”1“ 不需要进行反码操作。
    补码:为了处理-0与+0同时存在问题. (对反码进行+1操作,如果最高位/开头位被”溢出“,则舍去)
              -0的原码是1000,反码是1111,如果+1,则它的补码是10000,如果这是四位字长的二进制存放位,就要把1舍去
               ,即-0的补码变成了0000,这是我们希望的不分正负的0的表示方式,解决了+0-0同时存在问题。   
               相应的,当3+(-3)的时候,有0011 + 1101(1100的补码) =10000,舍去最高为1,即结果为0000,是我们希望的 
    demo分析:f1转换成二进制是1111 0001  ,ff 则为1111 1111
                       (1) 在第一行print中,我们参数选择的是big正序,false不分正负符号,即:
                                 直接转换正序 f1ff 二进制:1111 0001 1111 1111 转换为十进制:61951
                       (2)在第二行print中,我们参数选择的是little反序,true代表区分正负符号,即:
                                 首先转换 f1ff 为反序 fff1 ,反序的二进制有:1111 1111 1111 0001
                                 由于我们选择了true,所以要区分二进制的正负数含义:
                                 原码1111 1111 1111 0001最高位(开头位)是1,即此二进制数为负数。
                                 再进行反码操作,即有 1000 0000 0000 1110
                                 再进行补码操作,有1000 0000 0000 1111
                                 由于最高位1(开头位)不进行二进制转换计算,所以我们将除了最高位1(表示负数)以外

                                     数字进行二进制转换十进制操作,即000 0000 0000 1111的十进制为15,即最后结果为-15.                      

    **************************************************************************************************************************************************************

    1.int.from_bytes函数

    • 功能:res = int.from_bytes(x)的含义是把bytes类型的变量x,转化为十进制整数,并存入res中。其中bytes类型是python3特有的类型。
    • 函数参数:int.from_bytes(bytes, byteorder, *, signed=False)。在IDLE或者命令行界面中使用help(int.from_bytes)命令可以查看具体介绍。bytes是输入的变量;byteorder主要有两种:'big'和'little';signed=True表示需要考虑符号位。
    • 举例说明:int_s  = int.from_bytes(s, byteorder='little', signed=True),其中s='xf1xff',则输出int_s=-15。分析一下过程,'x'表示十六进制数,先把'f1'写成二进制数:1111 0001,'ff'同上:1111 1111.由于s的高低位标志是'little',即'f1'是低位,'ff'是高位,所以正确的顺序应该是'fff1',即11111111 1111 0001.又因为要考虑符号位,第一位是1,所以s是负数,要进行取反加一才是正确的十进制数(第一位符号位的1不变),可以得到10000000 00001111,写成十进制,就是-15,也就是int_s的结果。上面的例子中,如果signed=False,则无符号位;若byteorder='big',则输入s的左边是高位,右边是低位。
      1. >>> s1 = b'xf1xff'
      2. >>> print(int.from_bytes(s1, byteorder='little', signed=True))
      3. -15
      4. >>> print(int.from_bytes(s1, byteorder='big', signed=False))
      5. 61951
      6. >>> s2 = b'xffxf1'
      7. >>> print(int.from_bytes(s2, byteorder='little', signed=False))
      8. 61951

     

    2.int.to_bytes函数

    功能:是int.from_bytes的逆过程,把十进制整数,转换为bytes类型的格式。 

  • 相关阅读:
    牛客网-求和
    牛客网-删除公共字符
    牛客网-字符串中找出连续最长的数字串(好未来)
    牛客网-求数列的和(挖财)
    牛客网-树的高度(小米)
    牛客网-藏宝图(网易)
    【Python学习笔记】
    php平滑升级
    Nginx平滑升级
    linux下线刷硬盘
  • 原文地址:https://www.cnblogs.com/Zhouzg-2018/p/9662897.html
Copyright © 2011-2022 走看看