以下是位掩码常用操作的详细解释,并附上每种操作的示例代码及注释:
-
设置位(Set bits):
使用位或操作(OR,|
)来设置一个或多个特定位。此操作将指定位置1。uint8_t register = 0b00001100; // 初始寄存器值:00001100 uint8_t mask = 0b00000010; // 掩码:00000010 register |= mask; // 将寄存器的第1位置1 // 结果:register = 0b00001110
-
清除位(Clear bits):
使用位与操作(AND,&
)和掩码的补码(NOT,~
)来清除特定位。此操作将指定位清零。uint8_t register = 0b00001110; // 初始寄存器值:00001110 uint8_t mask = 0b00000010; // 掩码:00000010 register &= ~mask; // 将寄存器的第1位清0 // 结果:register = 0b00001100
-
检查位(Check bits):
使用位与操作(AND,&
)来检查特定位的状态。此操作用于判断特定位是否为1。uint8_t register = 0b00001100; // 初始寄存器值:00001100 uint8_t mask = 0b00000100; // 掩码:00000100 if ((register & mask) != 0) {// 结果:特定位(第2位)为1 } else {// 如果为0,进入此分支 }
-
切换位(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)
-
提取位(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(提取的位值)
-
合并位(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
-
创建掩码(Create mask):
使用位移操作(<<)来创建一个掩码,其中只有特定位被设置。uint8_t bitPosition = 3; // 目标位位置 uint8_t mask = 1 << bitPosition; // 创建掩码:00001000 // 结果:mask = 0b00001000
-
位域填充(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
-
位掩码生成(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
-
位掩码应用(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的相应位
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 & ~mask | mask位置0,其他为保留 | 通道反向筛选器:清除指定位,其他位保留 |
a | mask | mask位置1,其他为保留 | 画家画1:指定位画1,其他位为保留 |
a | ~mask | mask位保留,其他位置1 | |
a ^ mask | 取反mask位,其他为保留 | 指定位取反,其他位保留 |
a ^ ~mask | mask位保留,其他为取反 |