位运算的巧妙设计
位运算符
例子 | 名称 | 结果 |
$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,通过位运算,能快速计算一些问题。当然,我们在定义一些变量的时候,也要遵循一定的原则。以上文章只是让大家了解一个道理而已。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?