这里讲述 python 的基础,位运算。
首先在Python
中可以通过以"0b"
或者"-0b"
开头的字符串来表示二进制。
print(0b0011)
3
print(-0b0011)
-3
例子如下:
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
注意:负数按补码形式参加按位与运算。
正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。
10000000 00000000 00000000 00000101 是 -5的 原码。
除符号位外,各位取反
11111111 11111111 11111111 11111010
然后 + 1
11111111 11111111 11111111 11111011 是 -5 的补码
- 反码有正负 0 的区分
- 补码没有正负 0 的区分
进制转化
print("十进制数为:", dec)
print("转换为二进制为:", bin(dec))
print("转换为八进制为:", oct(dec))
print("转换为十六进制为:", hex(dec))
print(bin(-3))
-0b11
&
按位与运算符:参与运算的两个值
两位同时为1,结果才为1,否则结果为0
- 0&0=0
- 0&1=0
- 1&0=0
- 1&1=1
取一个数的指定位
比如取数 X=1010 1110
的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111
,然后将X与Y进行按位与运算(X&Y=0000 1110)
即可得到X的指定位。
print(bin(5))
0b101
print(bin(-5))
-0b101
print(5 & 0b0011)
print(0101 & 0011) = (0001) = 1
1
print(-5 & 0b0011)
print(1011 & 0011) = (0011) = 3 「查看负数的补码」
3
}
判断奇偶
取余数 n%2
等价于 判断二进制最右一位值 n&1
1 的二进制是 b:0001
假设为 3 ,其二进制为 b:0011 当进行如下操作的时候
0011 & 0001 = 0001 = 1
n & 1 = n % 2 = 1
假设为 4 ,其二进制为 b:0100 当进行如下操作的时候
0100 & 0001 = 0000 = 0
n & 1 = n % 2 = 0
|
按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。
- 0|0=0
- 0|1=1
- 1|0=1
- 1|1=1
常用来对一个数据的某些位设置为1
比如将数 X=1010 1110
的第4
位设置为1
,只需要另找一个数Y
,令Y的第4
位为1
,其余位为0
,即Y=0000 1111
,然后将X
与Y
进行按位或运算(X|Y=1010 1111)
即可得到。
^
按位异或运算符:当两对应的二进位相异时,结果为1。
异或的性质
两个数字异或的结果a^b
是将 a
和 b
的二进制每一位进行运算,得出的数字。 运算的逻辑是
- 如果同一位的数字相同则为
0
,不同则为1
异或的规律
- 任何数和本身异或则为
0
a^b^b=a^0=a; - 任何数和
0
异或是本身 x^x=0,x^0=x - 满足交换律
- 满足结合律 (a^b)^c == a^(b^c)
~
按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1
<<
左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
print(5 << 2)
20
5 = 0101 << 2 = 010100 = 20
print(-5 << 2)
-20
-5 = 11011 << 2 = 1101100 还原成原码 110100 = -20
>>
右移动运算符:把”>>”左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
操作数每右移一位,相当于该数除以2。
print(5 >> 2)
1
5 = 0101 >> 2 = 0001 = 1
print(-5 >> 2)
-2
-5 = 11011 >> 2 = 11110 补码还原成原码 10010 = -2
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c = 0
c = a & b; # 12 = 0000 1100
c = a | b; # 61 = 0011 1101
c = a ^ b; # 49 = 0011 0001
c = ~a; # -61 = 1100 0011
c = a << 2; # 240 = 1111 0000
c = a >> 2; # 15 = 0000 1111