1.原码,反码,补码
今天呢,刚开始学习python的一些基础知识,在位运算符中,通常使用以下几个符号:& | ^ << >>,其中涉及到了原码,反码,补码的理解。下面简单介绍一下&,<<
原码:正数的原码就是本身的二进制码,比如5,原码就是0101,而负数的话要在首位也就是符号位变成1,表示负数,即 -5 的原码为1101。
反码:即首位符号位不变,其余位数0变成1,1变成0,如5的原码为0101,反码即为0010,-5的反码为1010。
补码:补码的产生是由于负数表示和计算的需要,正数的补码是本身的原码,但是负数的补码则是反码加1,例如-5,原码为1101,反码为1010,补码为1011。
验证:将5的原码与-5的补码相加结果应为0
0101+1011=10000,这里可以看到溢出了一位,结果我们只取后四位。
所有的运算,都使用补码进行运算,因为原码的补码就是本身,负数就要转换成补码进行运算。计算机底层存储数据的时候都是使用补码存储。(二进制变成中的表示方法,前面加上0b,例:1的二进制表示赋值给a,a=0b0001)
运算符&,两个都为一时取1,否则为0,例0001&0101=0001
a = -5 #原码1101 反码1010 补码1011,负数使用补码运算
b = 4 #原码0100,正数使用原码运算
print(a&b) #1011&0100=0000
print(a+b) #1011+0100=1111(首位1表示符号为负)
运算符 <<:
<< 相当于乘法,每移动一位,相当于*2
-4<<1
#-4的原码 100000100 反码11111011 补码11111100 (不是所有的数原码和补码一样)
#左位移1位为11111000--补码 10001000--原码 -8
#原码--补码 转换成反码+1
#补码--原码 转换成反码+1
-4<<2 #向左移动两位
#左移动2位为11110000--补码,原码为补码转换成反码+1,原码为10010000,首位为符号位,结果为-16
运算符 >>:类比运算符<<,向右移动,每移动一位,相当于除以2,如果不能整除,则向下取整。