一些非常 常见的运算优化方式。或许有时候并不那么直观表意了,但在极致看重资源效率等情况下,还是可以多用用的,哪怕心里知道也行,提高对这些的敏感度
举例
- 一个数 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负载均衡。