python二进制、整型互相转换(含字符串二进制转整型,附八进制、十六进制与整型的相互转换)

python位运算符:

1、左移:x << y
返回 x 向右移 y 位得到的结果,只需要记住结果 b = x*pow(2, y)
——
2、右移:x >> y
返回 x 向左移 y 位得到的结果,只需要记住结果 b = x/pow(2, y)
——
3、与:x & y
与操作,返回结果的每一位是 x 和 y 中对应位做 and 运算的结果,只有 1 and 1 = 1,其他情况为0
——
4、或:x | y
或操作,返回结果的每一位是 x 和 y 中对应位做 or 运算的结果,只有 0 or 0 = 0,其他情况位1
——
5、非:~x
反转操作,对 x求的每一位求补,只需记住结果是 b = -x - 1
——
6、异或:x ^ y
两个位相同为0,相异为1 (常用统计不相同数) 不同为1
异或基本公式:
a ^ a = 0
a ^ 0 = a
a ^ b ^ c = a ^ c ^ b

实例代码:

1、左移、右移、非运算

>>> a = 0b111101010101
>>> print(int(a))
3925
# 左移运算
>>> print(int(a<<1)) # 结果即为 a*2
7850
>>> print(int(a<<2)) # 结果即为 a*2*2
15700
# 右移运算
>>> print(int(a>>1)) # 结果即为 a/2
1962
>>> print(int(a>>2))  # 结果即为 a/2/2
981
# 非运算
>>> print(int(~a))  # 结果即为 -a-1
-3926

2、与、或、异或 运算

>>> a = 0b1010101111
>>> b = 0b1000010110
># 与运算
>>> print(a&b)
518
>>> print(bin(a&b))  # 对应位置都为1才置1,否则置0
0b1000000110
# 或运算
>>> print(a|b)
703
>>> print(bin(a|b))  # 对应位置都为0才置0,否则置1
0b1010111111
# 异或运算
>>> print(a^b)
185
>>> print(bin(a^b))  # 对应位置相同为0,相异为1
0b10111001

简单应用:

1、找奇数偶数

for i in range(100):  #打印所有奇数
    if i&1==1:
        print(i)

for i in range(100):  #打印所有偶数
    if i&1==0:
        print(i)

2、消去最后一位1

>>> x =  121
>>> x&(x-1)
120
>>> x =  12342354
>>> x&(x-1)
12342352
>>> print(bin(x))
0b101111000101010001010010
>>> print(bin(x&(x-1)))
0b101111000101010001010000

3、找只出现一次的数字
(1)除了某个元素只出现一次以外,其余每个元素均出现了2次。找出那个只出现了一次的元素。

nums = [9,3,2,9,7,2,7]
a = 0
for item in nums:
    a = a ^ item
print(a)  # 输出结果为3

(2)除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

nums = [9,3,7,9,7,9,7]
a = 0
b = 0
for item in nums:
    a = (a ^ item) & (~b)  
    b = (b ^ item) & (~a)
print(a)  # 输出结果为3

4、交互两个整型值

def swap(a, b):
    a = a ^ b   # 以a为临时变量
    b = a ^ b   #  b=a^b => b=(a^b)^b => a^(b^b) => a
    a = a ^ b   #  a=a^b => a=a^(a^b) => (a^a)^b => b
    return a, b
a = 12
b = 24
a, b = swap(a, b)
print(a, b)  #输出结果为 24, 12

位运算骚操作:

1、力扣刷题:50.Pow(x, n)(二分法、普通和位运算两种写法,方法一样,很好理解)
3、力扣刷题笔记:85. 最大矩形(位运算,详细代码注释))