python-位运算
1.二进制
1.1什么是二进制
二进制是由0和1组成,逢2进1。
而十进制是逢10进1
例如:1, 10, 101, 1010111
这些都是二进制数。
十进制由0-9组成。
例如:0, 9, 5, 12, 58
这些都是十进制数。
计算机只认识二进制,所有的运算都是通过二进制。我们现在用的一些编程语言在最后都会编译成二进制。二进制才是计算机的本质。
二进制 | 十进制 |
---|---|
1 | 1 |
10 | 2 |
11 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
1000 | 8 |
1001 | 9 |
1.2有符号与无符号
按照一个字节等于8位来计算1byte=8bit
无符号
是什么就是是什么
有符号
最高位是符号位:1(负数) 0(正数)
十进制 | 二进制 |
---|---|
-1 | 1000 0001 |
1 | 0000 0001 |
-10 | 1000 0001 |
1.3原码反码补码
而在二进制中,由三种形式分别为:原码,反码,补码
原码:
最高位符号位
反码:
正数:反码和原码相同
负数:符号位一定是1,其余位对原码取反。
补码:
正数:补码和原码相同
负数:符号位一定是1,反码+1
1.3有符号与无符号
按照一个字节等于8位来计算1byte=8bit
无符号
是什么就是是什么
1000 0001
就是1000 0001
有符号
最高位是符号位:1(负数) 0(正数)
十进制 | 二进制 |
---|---|
-1 | 1000 0001 |
1 | 0000 0001 |
-10 | 1000 0001 |
1.4位运算
计算机不知道加法是什么,减法是什么,只知道以下这些操作。
1.4.1与运算(and &)
两个都为1,结果变为1
1011 0001
1101 1000
结果:1001 0000
1.4.2或运算(or |)
只要一个为1,结果变为1
1011 0001
1101 1000
结果:1111 1001
1.4.3异或运算(xor ^)
不相同的,则变为1
1011 0001
1101 1000
结果:0110 1001
1.4.4非运算(单目运算符 not ~)
0变1,1变0
1101 1000
结果:0010 0111
1.4.5位运算(移动位)
左移(<<)
0000 0001 # 所有二进制数向左移位,高位丢弃,低位补0。
# 结果
0000 0010 # 例如向左一位
右移( >>)
0000 0001 # 所有二进制数向右移位,低位丢弃,高位补0或1(符号位决定)
#结果
0000 0000 # 例如向右一位
1.5二进制加法
十进制:1+2
计算机运算过程:
先进行异或运算
0000 0001
0000 0010
结果:0000 0011
再进行与运算,如果得出的结果是:0000 0000
,则最总结果为上一步的异或结果
0000 0001
0000 0010
结果:0000 0000
所以最总结果为0000 0011
,十进制表示为3
,1+2 就等于3
2.python中使用
a = 3
b = 4
print("a二进制表示:",bin(a))
print("b二进制表示:",bin(b))
print("\n")
print("与运算")
print("a&b十进制结果:",a&b)
print("a&b二进制结果:",bin(a&b))
print("\n")
print("或运算")
print("a|b十进制结果:",a|b)
print("a|b二进制结果:",bin(a|b))
print("\n")
print("异或运算")
print("a^b十进制结果:",a^b)
print("a^b二进制结果:",bin(a^b))
print("\n")
print("非运算")
print("~a二进制结果:",bin(~a))
print("~a十进制结果:",~a)
print("~b二进制结果:",bin(~b))
print("~b十进制结果:",~b)
print("\n")
print("左移")
print("a<<1十进制结果:",a<<1)
print("a<<1二进制结果:",bin(a<<1))
print("b<<1十进制结果:",b<<1)
print("b<<1二进制结果:",bin(b<<1))
print("\n")
print("右移")
print("a>>1十进制结果:",a>>1)
print("a>>1二进制结果:",bin(a>>1))
print("b>>1十进制结果:",b>>1)
print("b>>1二进制结果:",bin(b>>1))
运算结果:
a二进制表示: 0b11
b二进制表示: 0b100
与运算
a&b十进制结果: 0
a&b二进制结果: 0b0
或运算
a|b十进制结果: 7
a|b二进制结果: 0b111
异或运算
a^b十进制结果: 7
a^b二进制结果: 0b111
非运算
~a二进制结果: -0b100
~a十进制结果: -4
~b二进制结果: -0b101
~b十进制结果: -5
左移
a<<1十进制结果: 6
a<<1二进制结果: 0b110
b<<1十进制结果: 8
b<<1二进制结果: 0b1000
右移
a>>1十进制结果: 1
a>>1二进制结果: 0b1
b>>1十进制结果: 2
b>>1二进制结果: 0b10