美文网首页
二进制的一些些感悟

二进制的一些些感悟

作者: DJ_f3ee | 来源:发表于2019-02-09 17:40 被阅读0次

            正值期末考试,得考点儿二进制,emmm,似乎就是取余和求商,但是每次都得慢慢算,就没意思了。

    题目类似这样的 二进制

    于是用python 写了写10进制与任意进制之间的转换,省得每次都手算。


    二进制还有移位 异或 之类的运算 在 leetcode 题目上碰到了。

    leetcode上异或运算

    当时碰到时,还想暴力破解,一个一个去判断,然后看了看大神们做的emm,有点儿神奇

    》《 这其中的 ^ 就是按位异或运算符号,原理如上

    逻辑“异或” 和 ‘或’ 有所不同,如果操作的位相同,则结果为 0 ;否则为1

    从二进制10 --->100 就扩大一倍,emmm,觉得好神奇,查了查,发现是逻辑左移

    python实现了

    class Shiftnum:

        def __init__(self):

            return

    #逻辑左移

        def leftShift(num , m):

            return num << m

    #算术右移

        def rightCountShift(num , n):

            return num >> n

    print(Shiftnum.leftShift(100, 2) )

    逻辑右移在java 和 Python 语言中使用  >>> 表示 ,而算术右移使用 >> 表示。而在 C C++语言中,逻辑右移和算术右移同用 >> ,是根据 运算类型 是否是 signed or unsigned.

    右移位前面补0还是补1呢呀,hah

    右移前面是补0还是补一呢

    先不解释,先来解决一个问题,计算机如何表示负数。                                                                     

    计算机CPU的运算器只实现了加法器。那么如何做减法运算。首先,如何让计算机理解负数,人们将二进制数分为有符号数(signed)和无符号数(unsigned) 。有符号数,最高位为0,代表正数;为1则为负数。

    如果是无符号数,那么最高位不是符号位,那么他们·代表的都是正数 。常见的编程语言如java c有关的数据类型包含符号数。

    由于现实中的计算机有物理的约束,不能表示无穷大和无穷小。以常见的32位计算机为例,最高位2^31 -1(不包括符号位),最小位-2^31,由于计算机数据的溢出,就相当于取模,而其取模的除数是数据类型的上限减去下限的值,再加上1,就是(2^(n-1)-1)-(-2^(n-1))+1=2x2^(n-1) -1 +1。

    如果写成2^n就是n+1位了,比如,16是10000即5位,15是1111即4位。

    原理

    反码只是计算机运算过程中易于计算得到的一个值而已,没有什么实际意义,真正有用的是补码。比如上图反码是5,是因为-2+7,如果直接加,就是-2+7+3,那么就是8,从-8左边起,只能用0表示(3-2)的结果,所以必须用补码。

    这个包含了溢出的知识,百度里有。

      reference:极客时间  程序员的数学课       

                        https://wiki.python.org/moin/BitwiseOperators                                                                          常见问题:运  算  符  <<,  >>, &,|,〜和^有什么作用?

                        https://blog.csdn.net/baidu_34464794/article/details/53610246                                                >> 算数右移和>>>逻辑右移

    百度 补码

    相关文章

      网友评论

          本文标题:二进制的一些些感悟

          本文链接:https://www.haomeiwen.com/subject/ackzsqtx.html