简单一些常见的运算优化
一些非常 常见的运算优化方式。或许有时候并不那么直观表意了,但在极致看重资源效率等情况下,还是可以多用用的,哪怕心里知道也行,提高对这些的敏感度
举例
-
一个数 n 与 2^k - 1 进行 位与 运算 n & (2^k - 1),相当于取 n 在二进制形式下最低的 k 位,这等效于 n % 2^k 取模的结果。
- 比如阿里云oss的性能最佳实践里,建议将顺序前缀改为随机性前缀,以避免部分分区成为热点而过载,即大量文件集中在少数几个分区中。为了更好的平衡,可以使用一定的方式来合理划分文件索引,让各个分区的IO负载均衡。
假如我们通过对业务内的某个字段值进行统一的某种运算获取结果,作为oss存储路径前缀一部分,从而将业务数据均衡的划分到不同的路径索引下。此时就可以进行 位与 运算。打比方,所有的该业务字段对 8 取模,将结果作为路径前缀之一。打比方 29 % 8 = 5,则可以换为 29 &(8-1) = 5
因为29 在二进制中是 11101 ,而(8-1)也就是(2^3 - 1)2的三次方后减 1 ,结果7 的二进制是00111 。所以位与操作就是 11101 & 00111=00101,保留了11101的低三位101 (位与 运算只有二者的同位都是1时,才会得到1,其他都是0),而101的十进制就是 5 - 当然前面的赘述只是给个场景,其实我们在遇到数据时,可以先看看是否为2的幂,2的幂在二进制下只有一位是1,其余都是0 (比如512,是2的9次方,只有最高位是1,其余位全是0,二进制是1000000000。而511则是2的9次方减1,二进制是111111111,九位全是1,非常适合用 位与 运算来优化相应的取模运算)
- 比如阿里云oss的性能最佳实践里,建议将顺序前缀改为随机性前缀,以避免部分分区成为热点而过载,即大量文件集中在少数几个分区中。为了更好的平衡,可以使用一定的方式来合理划分文件索引,让各个分区的IO负载均衡。
-
异或
^
异或运算(XOR,符号为^)是一种常见的位操作,其规则如下:
- 各个位进行比较:
- 如果两个对应的位相同(都是 0 或都是 1),则结果位为 0。
- 如果两个对应的位不同(一个是 0,一个是 1),则结果位为 1。
换句话说,异或运算的结果表示两个输入位的“不同性”。以下是一个简单的例子:
假设我们有两个二进制数:
- ( A = 1010 )
- ( B = 1100 )
进行异或运算:
[ A ^ B = 0110 ]
各位应用 规则:
- 第一位:1 和 1,结果为 0
- 第二位:0 和 1,结果为 1
- 第三位:1 和 0,结果为 1
- 第四位:0 和 0,结果为 0
异或运算的特点和用法包括:
- 自反性:对于任意整数 ( a ),有 ( a ^ a = 0 )。这用于检测是否重复,如在位图中快速清除已设置的位。
- 交换律和结合律:( a ^ b = b ^ a ) 和 ( (a ^ b) \oplus c = a ^ (b ^ c) ),这使得它可以在不改变结果的情况下重排和组合。
- 零元:( a ^ 0 = a )。任何数与 0 异或结果为其自身。
- 反转位:当一个数与一个掩码进行异或时,可以翻转掩码中 1 位对应的那些位。例如,翻转一个数的最低位可以用 a ^ 1。
结合这些特性,异或常用于加密算法(如简单的流式加密),位翻转及校验和生成,以及在无额外空间情况下交换两个整数的值(就是不用第三个变量中转来调换另外两个变量的值)

浙公网安备 33010602011771号