刷题骚操作:python位运算符作用详解、计算公式(通俗易懂,小白也能使用位运算)

python二进制、整型互相转换(含字符串二进制转整型,附八进制、十六进制与整型的相互转换)
https://blog.csdn.net/weixin_44414948/article/details/112603741

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)(二分法、普通和位运算两种写法,方法一样,很好理解)
https://blog.csdn.net/weixin_44414948/article/details/113820505
2、python判断一个数是否为2的幂次方(位运算秒用)
https://blog.csdn.net/weixin_44414948/article/details/113137922
3、力扣刷题笔记:85. 最大矩形(位运算,详细代码注释)
https://blog.csdn.net/weixin_44414948/article/details/111739190

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值