位运算的巧妙设计

 
位运算符
 
例子 名称 结果
$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,通过位运算,能快速计算一些问题。当然,我们在定义一些变量的时候,也要遵循一定的原则。以上文章只是让大家了解一个道理而已。

 

 

 

posted @ 2017-04-11 17:31  小小情意  阅读(624)  评论(2编辑  收藏  举报