zoukankan      html  css  js  c++  java
  • 位运算的巧妙设计

     
    位运算符
     
    例子 名称 结果
    $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,通过位运算,能快速计算一些问题。当然,我们在定义一些变量的时候,也要遵循一定的原则。以上文章只是让大家了解一个道理而已。
  • 相关阅读:
    [Jenkins] 批量删除构建历史
    [Android Tips] 32. 解决 Android Device Monitor 在 Mac OS X 卡住
    [Gradle] 查看项目依赖
    [Gradle] 获取 gradle 命令行参数
    [Android Tips] 31.如何将第三库引入的 Permission 删除掉
    [Gradle] 发布构件到本地仓库
    [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码
    下载安卓应用的历史版本
    设置int、float型数据的输出格式
    头文件limits—各个类型的数据的范围
  • 原文地址:https://www.cnblogs.com/xiaoxiaoqingyi/p/6694545.html
Copyright © 2011-2022 走看看