最近在研究 Redis 源码,发现一些平时不怎么用的编码习惯,感觉挺有趣,记录下
function isOdd1($num) {
return ($num % 2) == 1;
}
function isOdd2($num) {
return ($num & 1) == 1;
}
以上两个方法都是用来判断一个数是否为奇数,但是用到的操作符不同,有什么区别 ?
%:取模操作符是基于 十进制(人类思维) 的一种取模方式,如:11 % 4 = 3,常用在各种操作中,可判断奇偶,也可以用在哈希中,如:11 % 8 = 3,落在第 3 个槽中,即 $arr[3-1] 中
&:按位与是基于 二进制 的,如:11 & 1 = 00001011 & 00000001 = 1,常用在 哈希 中,如计算出的 哈希 值为 11,哈希槽个数为 8,则 11 & (8-1) = 00001011 & 00000111 = 00000011 = 2,即 $arr[2] 中
虽然只是符号的差别,但是性能差距还是蛮大的,有 10 倍的差距(可能体现不明显),但有如下好处:
1.积少成多,如果处处都追求这种高效的方式,整体代码质量可能也会更高,放到 C 语言也是如此,像 Redis 这种追求超高性能的软件,一定会用位运算的
2.如果别人看到了你的代码是这样,一定会觉得有点高大上的,毕竟一般很少有人用
但也有坏处:
1.由于非人类语言,所以有可能用出错误
2.别人看你的代码,有可能需要绕个弯才能懂
哈哈~