当前位置:   article > 正文

位掩码操作进阶

位掩码操作进阶

以下是位掩码常用操作的详细解释,并附上每种操作的示例代码及注释:

  1. 设置位(Set bits)
    使用位或操作(OR, |)来设置一个或多个特定位。此操作将指定位置1。

    uint8_t register = 0b00001100;  // 初始寄存器值:00001100
    uint8_t mask = 0b00000010;      // 掩码:00000010
    register |= mask;               // 将寄存器的第1位置1
    // 结果:register = 0b00001110
    
    • 1
    • 2
    • 3
    • 4
  2. 清除位(Clear bits)
    使用位与操作(AND, &)和掩码的补码(NOT, ~)来清除特定位。此操作将指定位清零。

    uint8_t register = 0b00001110;  // 初始寄存器值:00001110
    uint8_t mask = 0b00000010;      // 掩码:00000010
    register &= ~mask;              // 将寄存器的第1位清0
    // 结果:register = 0b00001100
    
    • 1
    • 2
    • 3
    • 4
  3. 检查位(Check bits)
    使用位与操作(AND, &)来检查特定位的状态。此操作用于判断特定位是否为1。

    uint8_t register = 0b00001100;  // 初始寄存器值:00001100
    uint8_t mask = 0b00000100;      // 掩码:00000100
    if ((register & mask) != 0) {
        // 结果:特定位(第2位)为1
    } else {
        // 如果为0,进入此分支
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  4. 切换位(Toggle bits)
    使用位异或操作(XOR, ^)来切换特定位的状态。此操作将指定位从0变为1,或从1变为0。

    uint8_t register = 0b00001100;  // 初始寄存器值:00001100
    uint8_t mask = 0b00000100;      // 掩码:00000100
    register ^= mask;               // 切换寄存器的第2位
    // 结果:register = 0b00001000(第2位从1变为0)
    
    • 1
    • 2
    • 3
    • 4
  5. 提取位(Extract bits)
    使用位与操作(AND, &)来提取寄存器中特定位的值,然后通过右移操作(>>)获取这些位的值。

    uint8_t register = 0b10101100;  // 初始寄存器值:10101100
    uint8_t mask = 0b00001100;      // 掩码:00001100(提取第2位和第3位)
    uint8_t extractedValue=(register & mask)
    //结果:extractedValue = 0b0001100
    uint8_t extractedValue =extractedValue>>2;  // 提取并右移2位
    // 结果:extractedValue = 0b00000011(提取的位值)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  6. 合并位(Merge bits)
    使用位移操作(<<, >>)来改变位的位置,然后使用位或操作(OR, |)将它们合并到目标寄存器中。

    uint8_t register = 0b00001100;  // 初始寄存器值:00001100
    uint8_t value = 0b00000011;     // 待合并的值:00000011
    uint8_t shift = 4;              // 移动4位
    register |= (value << shift);   // 将value左移4位后合并到寄存器中
    // 结果:register = 0b00111100
    
    • 1
    • 2
    • 3
    • 4
    • 5
  7. 创建掩码(Create mask)
    使用位移操作(<<)来创建一个掩码,其中只有特定位被设置。

    uint8_t bitPosition = 3;          // 目标位位置
    uint8_t mask = 1 << bitPosition;  // 创建掩码:00001000
    // 结果:mask = 0b00001000
    
    • 1
    • 2
    • 3
  8. 位域填充(Bit field fill)
    使用位掩码和位移操作来填充或清除一个位域(bit field)。

    uint8_t register = 0b11001100;         // 初始寄存器值:11001100
    uint8_t fieldMask = 0b00001111;        // 位域掩码:00001111
    uint8_t value = 0b00000010;            // 新值:00000010
    register = (register & ~fieldMask) | (value & fieldMask);  
    // 清除fieldMask指定的位域,然后设置为value
    // 结果:register = 0b11000010
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  9. 位掩码生成(Mask generation)
    使用循环或递归方法生成一个位掩码,其中一段连续的位被设置。

    uint32_t generateMask(uint32_t bitStart, uint32_t bitLength) {
        uint32_t mask = 0;
        for (uint32_t i = 0; i < bitLength; ++i) {
            mask |= (1 << (bitStart + i));
        }
        return mask;
    }
    
    uint32_t mask = generateMask(2, 3); // 生成掩码:00011100
    // 结果:mask = 0b00011100
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  10. 位掩码应用(Apply mask)
    将位掩码应用于变量,以实现只修改或检查变量的某些部分。

    uint8_t originalRegister = 0b11001100;  // 初始寄存器值:11001100
    uint8_t someMask = 0b00001111;          // 掩码:00001111
    uint8_t newValue = 0b00000010;          // 新值:00000010
    uint8_t modifiedRegister = (originalRegister & ~someMask) | (newValue & someMask);
    // 结果:modifiedRegister = 0b11000010
    // 保留someMask指定的位不变,其他位设置为newValue的相应位
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

mask1&mask2 掩码域1和掩码域2的交集
mask1|mask2 掩码域1和掩码域2的并集

总结:
& 遇0为0 遇1为原始
| 遇1为1 遇0为原始
^ 遇1为1取反 遇0为原始
原始值,则说明取出指定位。
为1,则说明可以置1指定位
为0,则说明可以清0指定位

a&mask mask中指定位为1,与1为原始,则取出了指定位,其他位清0.
a&~mask ~mask中指定位为0, 与0为0,则清0了指定位,其他位为a中原值

mask的mask位(指定位)为1,其他位为0**

a&mask保留mask位,其他位置0筛选器,取出指定位,其他位清零
a & ~maskmask位置0,其他为保留通道反向筛选器:清除指定位,其他位保留
a | maskmask位置1,其他为保留画家画1:指定位画1,其他位为保留
a | ~maskmask位保留,其他位置1
a ^ mask取反mask位,其他为保留指定位取反,其他位保留
a ^ ~maskmask位保留,其他为取反
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/989512
推荐阅读
相关标签
  

闽ICP备14008679号