正值期末考试,得考点儿二进制,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 >> 算数右移和>>>逻辑右移
百度 补码
网友评论