二进制的一些些感悟

        正值期末考试,得考点儿二进制,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                                                >> 算数右移和>>>逻辑右移

百度 补码


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容