Pyhton基础入门:从变量到异常处理(二)

位运算
1.原码、反码和补码
2.按位运算
3.利用位运算实现快速计算
4.利用位运算实现整数集合

1.原码、反码和补码
二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。

原码:就是其二进制表示(注意,有一位符号位)。
【例】:
00 00 00 11 -> 3
10 00 00 11 -> -3

反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。
【例】:
00 00 00 11 -> 3
11 11 11 00 -> -3

补码:正数的补码就是原码,负数的补码是反码+1。
【例】:
00 00 00 11 -> 3
11 11 11 01 -> -3

符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。

2.按位运算
· 按位非操作~
~ 1 = 0
~ 0 = 1
~ 把 num 的补码中的 0 和 1全部取反(0变为1,1变为0)有符号整数的符号位在 ~ 运算中同样会取反。
【例】:
00 00 01 01 -> 5
~
11 11 10 10 -> -6
————————
11 11 10 11 -> -5
~(取反)
00 00 01 00 -> 4

·按位与操作 &
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
只有两个对应位都为1时才为1
【例】:
00 00 01 01 -> 5 & 00 00 01 10 -> 6
=00 00 01 00 -> 4

·按位异或操作^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
只有两个对应位不同时才为1
【例】:
00 00 01 01 -> 5 ^ 00 00 01 10 -> 6
=00 00 00 11 -> 3

·异或操作的性质:满足交换律和结合律
异或运算的用途:
1)使一个数的最低位为零
使a的最低位为0,可以表示为:a & ~ 1 。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为" ~"运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

【例】:
A:00 00 11 00
B:00 00 01 11

A ^ B:00 00 10 11
B ^ A:00 00 10 11

A ^ A:00 00 00 00
A ^ 0:00 00 11 00

A^ B ^C = A ^ A ^ B = B = 00 00 01 11

·按位左移操作 <<
定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
num << i 将 num 的二进制表示向左移动 i 位所得的值。
【例】:
00 00 10 11 -> 11
11 << 3
=01 01 10 00 -> 88

·按位右移操作 >>
定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位,相当于该数除以2。
num >> i 将 num 的二进制表示向右移动i位所得的值。
【例】:
00 00 10 11 -> 11
11 >> 2
=00 00 00 10 -> 2

3.利用位运算实现快速计算
通过 <<, >> 快速计算2的倍数问题。
【例】:
n << 1 -> 计算 n2
n >> 1 -> 计算 n/2,负奇数的运算不可用
n << m -> 计算 n
(2^m),即乘以 2 的 m次方
n >> m -> 计算 n/(2^m),即乘以 2 的 m次方
1 << n -> 2^n

通过 ^ 快速交换两个整数。通过 ^ 快速交换两个整数。
【例】:
a ^= b
b ^= a
a ^= b

通过 a & (-a)快速获取 a 的最后为1位置的整数。
【例】:
00 00 01 01 -> 5 & 11 11 10 11 -> -5
= 00 00 00 01 -> 1

00 00 11 10 -> 14 & 11 11 00 10 -> -14
= 00 00 00 10 -> 2

4.利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0表示不在集合中,1表示在集合中。)
比如集合{1,3,4,8},可以表示成 01 00 01 10 10 而对应的位运算也就可以看作是对集合进行的操作。

元素与集合的操作:
a | (1 << i) -> 把 i 插入到集合中
a & ~(1 << i) -> 把 i 从集合中删除
a & (1 << i) -> 判断 i 是否属于该集合(零不属于,非零属于)

集合之间的操作:
a 补 -> ~ a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
**【注意】**整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。

望批评指正!!!
如果您认为对您的学习有帮助,欢迎点赞收藏嘻嘻嘻。

未经同意不准转载O(∩_∩)O
参考材料来源于 阿里云天池Python训练营

你可能感兴趣的:(编程语言,java,c语言,python)