进制转换与位运算
学习位运算要先了解进制转换,进制转换如下
二进制转十进制
二进制以以0b开头
二进制1101转成十进制
1 1 0 1
1*23+1*22+ 0*21+1*20=13
有0的位置可以不用看,上述可直接写成23+22+20=13
#bin()是十进制转二进制的函数,0b代表二进制 a = 3 print(bin(a)) #输出为0b11 a = 13 print(bin(a)) #输出为0b1101 #二进制转十进制使用int()函数 b = 0b10111 print(int(b)) #输出为23
十进制转二进制
.. 28 27 26 25 24 23 22 21 20
256 128 64 32 16 8 4 2 1
例如:324的二进制位
324包括28 26 22
其他位补0
所以324的二进制为101000100
负数的二进制
负数有一个符号位,即第一位是1
先求它正数的二进制,然后再取反,末位加1
注意:8个二进制位即bit构成1个字节byte
例如:-5的二进制为
5的二进制是0000 0101
取反为1111 1010
末位加上1
最终-5的二进制为1111 1011
-8的二进制
8的二进制就是0000 1000 取反1111 0111 末位加1,进位 最终-8的二进制为1111 1000
八进制转十进制
八进制以0o开头
八进制:逢8进1,各个位上的数字不能大于8。
例如:0o6430的十进制为
6 4 3 0
6*83 + 4*82 + 3*81 + 0*80 =3352
a = 0o6430 print(int(a)) #输出为3352
八进制转二进制
三个数为一组
6 4 3 0 #找到各个数值对应的二进制
110 100 011 000
所以0o6430二进制为110100011000
十六进制转十进制
十六进制以0x开头
0x911转十进制
9 1 1
9*162+1*161+1*160 =2321
十六进制转二进制
四个数一组
9 a b 1 6
1001 1010 1011 0001 0110
所以0x9ab16的二进制为1001 1010 1011 0001 0110
位运算符
python中位运算符包括
& #位与
| #位或
^ #位异
~ #取反
<< #左移位
>> #右移位
位与运算
两个操作数据使用二进制表示,只有对应位都是1时,结果才是1,否则为0。
3&2
print(3&2) ''' 3的二进制为0000 0011 2的二进制为0000 0010 做与运算为 0000 0010 所以结果为2 '''
位或运算
两个操作数据使用二进制表示,只有对应位都是0时,结果才是0,否则为1。
5|3
print(5|3) ''' 5的二进制为0000 0101 3的二进制为0000 0011 做或运算为 0000 0111 所以结果为7
'''
位取反运算
也叫位非运算,也就是取反,1取0,0取1。
~5
print(~5) ''' 5的二进制为0000 0101 取反 1111 1010
此时第一位是1,是负数,开始进行负数的十进制运算
末位减1,就会得到1111 1001
在对它进行取反操作得到0000 0110
最后得到6,因为是负数所以要加上负号,即-6 '''
位异或运算
当两个二进制表示的操作数,两个数相同,同时为0或者1时,结果为0,否则为1。
^异或
print(3^5) ''' 3的二进制为0000 0011 5的二进制为0000 0101 结果为 0000 0110 6 '''
左移位运算
是将一个二进制操作数向左边移动指定的位数,左边溢出的位被丢弃,右边空出的位补0。
左移运算相当于操作数乘以2的n次幂。
<<
print(2<<1) ''' 2的二进制为0000 0010 左移一位为0000 0100 结果为4 '''
即2*21=4
右移位运算
是将一个二进制操作数向右边移动指定的位数,右边溢出的位被丢弃,如果是正数,左边空出的位补0,如果是负数,左边空出的位补1。
右移运算相当于操作数除以2的n次幂
>>右移
print(2>>1) ''' 2的二进制为0000 0010 右移一位为0000 0001 结果为1 '''
2/21=1(如果有小数直接去掉只取整数)
学习来自:B站大学 P24-26
《python从入门到项目实践》明日科技 第五章