赞
踩
以下是位掩码常用操作的详细解释,并附上每种操作的示例代码及注释:
设置位(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位保留,其他为取反 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。