一、理论知识bit(位):数据存储的最小单元。在计算机二进制系统中,位,简记为b,也称为比特(bit),每个二进制数字0或1就是一个位(bit),其中每 8bit = 1 byte(字节).
2. 位运算定义:计算机内所有的数都以二进制存储,位运算即为对二进制位的直接操作。
3. 二进制三种表示形式
①原码:对数字的二进制定点表示方法(有一位为符号位)在位运算中,符号位也参与运算
二进制的最高位是符号位:0表示正数,1表示负数
8bit:
00 00 00 11 -> 3
10 00 00 11 -> -3 [可以看出有一位为符号位]
②反码:正数的反码就是原码
负数的反码:原码符号位不变,其他位取反(0 ->1 ; 1->0 )
原码:10 00 00 11 -> -3
反码:11 11 11 00
③补码:在计算机运算的时候,都是以补码的方式来运算的
正数的补码就是源码
负数的补码:它的反码+1
0的反码、补码都是0
原码:10 00 00 11 -> -3
补码:11 11 11 01
二、Python中的位运算符按位非操作~
~1 = 0
~0 = 1
00 00 01 01 -> 5
~
---
11 11 10 10 -> -6按位与操作&
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
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
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
异或:取或再取反
00 00 01 01 -> 5
^
00 00 01 10 -> 6
---
00 00 00 11 -> 3按位左移操作 <<: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
三、利用位运算符实现快速计算通过<<,>>快速计算2的倍数问题。
示例:
n << 1 -> 计算 n*2
n >> 1 -> 计算 n/2,负奇数的运算不可用通过^快速交换两个整数。
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