学习目标:Python基础之位运算
一天掌握位运算的基础知识
学习内容:
1、 位运算的基础知识
学习时间:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点
学习产出:
1、CSDN 技术博客 1 篇
位运算
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 -
按位与操作 &
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 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0只要两个对应位中有一个 1 时就为 1
00 00 01 01 -> 5
|
00 00 01 10 -> 6
——
00 00 01 11 -> 7 -
按位异或操作 ^
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
异或操作的性质:满足交换律和结合律
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
ABA: = AAB = B = 00 00 01 11
- 按位左移操作<<
num << i 将num的二进制表示向左移动i位所得的值。
00 00 10 11 -> 11
11 << 3
——
01 01 10 00 -> 88
- 按位右移操作>>
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