位运算代替常规运算

使用位运算来代替常规运算

位运算代替整数得加法

首先我们先看看1位数加法, 在不考虑进位得情况下, 如下

1	1	-->0
1	0	–->1
0	0	-->0
0	1	-->1

显然, 这个运算可以通过异或来得到 a^b

当然, 这是不进位情况. 实际运算我们当然要进位了, 那么, 考虑一下什么情况下会进位呢? 如下, 在二进制得情况下, 只有1和1相加才会进位

1	1	-->1
0	1	-->0
1	0	-->0
0	0	-->0

很显然了, 当两个二进制一位数进行与运算得时候, 会得到哪个进位了 则有a&b

可是有个问题, 假如我得数字是A= 101, B= 001 用与操作

A & B = 001

最后一位是进位了, 可是进位之后应该是010啊, 进位到第二位了啊, 为什么还在第一位. 怎么办呢? 移位运算, 向左移动一位不就可以了啊

(A & B) << 1 = 010

此时, 进位结果和不进位加法已经算出来了, 怎么得到最终结果呢 两个相加呗

A = 11
B = 01

(1)  首先进行不进位加法
A ^ B = 10
(2)  获取进位
(A&B)<<1 = 01 << 1 = 10
这两个数相加, 不要问我怎么相加...

A = 10
B = 10
(1) A ^ B = 00
(2) (A & B) << 1 = 100

很明显了, 出现0了还加啥 最终结果就是110

总结一下, 位运算进行加法运算得时候, 式子是这样的 a+b = a^b + (a & b) << 1; 当然, 式中出现的加法需要递归运算, 经过总结, 可以发现, 三位二进制可以通过3次运算计算出结果. 四位二进制可以通过4次运算计算出结果

用位运算代替乘除法

当乘除2的n次幂的时候, 可以进行位运算

假如有数000100
乘以2
000100 * 10 = 001000  (右移一位)
乘以4(2的2次幂)
000100 * 100 = 010000  (右移两位)

总结: 当A*B 且 B= 2 n 2^n 2n时, A * B = A << n;

同理, 有乘就有除 当A/B 且 B = 2 n 2 ^ n 2n时, A / B = A >> n;

用位运算代替取模运算

取模运算就是算算能不能除进呗, 不能除进剩下得就是结果, 与乘除一样, 取余运算, 必须要取余算子是2得n次幂

假如对 8 取余, 结果肯定在1~7之间

假如有 69 对 8 取余
把69拆成二进制
01000101
把7拆成二进制
0111
找一样得, 就是&运算
01000101 & 0111 = 0101 = 5
69 % 8 = 5;

总结: A % B 且 B = 2 n 2^n 2n时 A%B = A & (B – 1);

点赞