位运算的巧妙设计

 
位运算符
 
例子 名称 结果
$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”)。
 
      我们在编程生涯中,偶尔会遇见一些 类似 |(按位或) 、&(按位与)、^(按位异或)等位运算符,我们只是了解它们大概的含义,确很少运用在实例当中,我举个例子:
1
2
3
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 @   小小情意  阅读(628)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示