python按位翻转_Python成为专业人士笔记-位操作符

“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com

按位操作符直接操作二进制的字符串,这些是最基本的操作,并直接由中央处理器所支持。

在处理设备驱动程序、图形底层、加密和网络通信时,这些位操作是必需的。本文提供一些有用的知识和对应Python的按位运算符示例

Bitwise NOT 位操作:否

〜运算符将翻转数字中的所有位, 由于计算机使用带符号的数字表示形式占大多数,所以值得注意的是,二进制补码符号用于在写入负数的情况下对负二进制数进行前导(1) 编码 而不是前导零(0)。

这意味着,如果您使用8位来表示您的二进制补码,则将处理 从0000 0000到0111 1111代表从0到127的数字并保留1xxx xxxx来代表负数

八位两位补码的数:

#位无符号值二进制补码值

0000 0000 0 0

0000 0001 1 1

0000 0010 2 2

0111 1110 126 126

0111 1111 127 127

1000 0000 128 -128

1000 0001 129 -127

1000 0010 130 -126

1111 1110 254 -2

1111 1111 255 -1

从本质上讲,这意味着1010 0110的无符号值为166(通过加(128 * 1)+(64 * 0)+(32 * 1)+(16 * 0)+(8 * 0)+(4 * 1)+(2 * 1)+(1 * 0)),它具有一个二进制补码值 -90(通过添加(128 * 1)-(64 * 0)-(32 * 1)-(16 * 0)(8 * 0)-(4 * 1)-(2 * 1)-(1 * 0),以及对值的补码)。

这样,负数的范围可以降至-128(1000 0000)。 Zero(0)表示为0000 0000,负号表示一(-1)为1111 1111,

这等同于〜n = -n-1:

# 0 = 0b0000 0000

~0

#输出: -1

#-1 = 0b1111 1111

# 1 = 0b0000 0001

~1

Out: -2

-2 = 1111 1110

2 = 0b0000 0010

~2

#输出: -3

#因为-3 = 0b1111 1101

#123 = 0b0111 1011

~123

#输出: -124

#因为 -124 = 0b1000 0100

注意,此操作应用于正数时的总体效果可以总结为:

~n -> -|n+1|

然后,当应用于负数时,相应的效果是:

~-n -> |n-1|

以下示例说明了最后一条规则:

#-0 = 0b0000 0000

~-0

#输出 -1

#-1 = 0b1111 1111

# 0是这个规则的例外,因为-0总是== 0

#-1 = 0b1000 0001

~-1

#输出: 0

#0 = 0b0000 0000

#-2 = 0b1111 1110

~-2

#输出: 1

#1 = 0b0000 0001

# -123 = 0b1111 1011

~-123

#输出: 122

#122 = 0b0111 1010

Bitwise AND 位操作:与

&操作符将执行二进制“与”操作,如果在两个操作数中都存在位,则复制该位。比如:

# 0 & 0 = 0

# 0 & 1 = 0

# 1 & 0 = 0

# 1 & 1 = 1

# 60 = 0b111100

# 30 = 0b011110

60 & 30

#输出: 28

#28 = 0b11100

bin(60 & 30)

#输出: 0b11100

Bitwise OR 位操作:或

‘|’操作符将执行一个二进制“or”,如果它存在于任何一个操作数中,那么就会复制一个位,比如:

# 0 | 0 = 0

# 0 | 1 = 1

# 1 | 0 = 1

# 1 | 1 = 1

#60 = 0b111100

#30 = 0b011110

60 | 30

#输出: 62

#62 = 0b111110

bin(60 | 30)

#输出: 0b111110

Bitwise Left Shift 位操作: 向左位移

‘<

#2 = 0b10

2 << 2

#输出: 8

#8 = 0b1000

bin(2 << 2)

#输出: 0b1000

执行1的左位移位相当于乘以2

7 << 1

#输出: 14

执行n的左位移位相当于乘以2**n :

3 << 4

#输出: 48

Bitwise Right Shift 位操作: 向右位移

‘>>’ 操作符将执行按位“右移”,即左操作数的值按右操作数提供的位数右移:

# 8 = 0b1000

8 >> 2

#输出: 2

# 2 = 0b10

bin(8 >> 2)

#输出: 0b10

执行1的右位移位等于2的整数除法 :

36 >> 1

#输出: 18

15 >> 1

#输出: 7

执行n的右位移位等于2**n的整数除法 :

48 >> 4

#输出: 3

59 >> 3

#输出: 7

重赋值操作

所有的位操作符(除了 ‘~’ ),都有固定的用法:

a = 0b001

a &= 0b010

#输出 a = 0b000

a = 0b001

a |= 0b010

#输出 a = 0b011

a = 0b001

a <<= 2

#输出 a = 0b100

a = 0b100

a >>= 2

#输出 a = 0b001

a = 0b101

a ^= 0b011

#输出 a = 0b110

禁止转载,违者必究!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值