位运算的巧妙设计
位运算符
例子 | 名称 | 结果 |
$a & $b | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b | Or(按位或) | 将把 $a 和 $b 中任何一个为 1 的位设为 1。 |
$a ^ $b | Xor(按位异或) | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 |
~ $a | Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b | Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
我们在编程生涯中,偶尔会遇见一些 类似 |(按位或) 、&(按位与)、^(按位异或)等位运算符,我们只是了解它们大概的含义,确很少运用在实例当中,我举个例子:
E_ERROR = 1; E_COMPILE_ERROR = 64; E_CORE_ERROR = 16;
当我们去判断一个变量的值($severity)是否是以上中的一个时,第一印象就想到以下方法:
if(E_ERROR ==$severity || E_COMPILE_ERROR == $severity || E_USER_ERROR == $severity ){ return TRUE; } else { return FALSE; }
认真我们会发现,用位运算,能很快且巧妙的解决这个问题:
if(((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR ) & $severity) === $severity){ return TRUE; } else { return FALSE; }
十进制:E_ERROR = 1; 换算成二进制: 1
十进制:E_COMPILE_ERROR = 64; 换算成二进制: 1000000
十进制:E_CORE_ERROR = 16; 换算成二进制: 10000
(E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR ) 三个常量通过 | 位运算得到 1010001
((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR ) & $severity 也就是 1010001 & $severity,
当 $severity = 1 时:
1010001 & $severity = 1, 所以 (1010001 & $severity) == $severity ;
当 $severity = 1000000 时:
1010001 & $severity = 1000000, 所以 (1010001 & $severity) == $severity ;
当 $severity = 10000时:
1010001 & $severity = 10000, 所以 (1010001 & $severity) == $severity
当 $severity 的值是上述三个常量中的一个,位运算之后就会得到与 $severity 本身的值一样,
所以该运算成立。
从上述我们知道,位运算符能很快的解决我们的问题,尤其是在一些算法当中,位运算符很常用,
因为我们的机器语言是 二进制,不是0就是1,通过位运算,能快速计算一些问题。当然,我们在定义一些变量的时候,也要遵循一定的原则。以上文章只是让大家了解一个道理而已。