背景介绍
位运算就是直接对整数在内存中的二进制位进行操作,它是C语言的强大的特性之一。
功能 | 位运算符 | 说明 |
---|---|---|
按位与 | a & b | |
按位或 | a | b | |
按位异或 | a ^ b | |
按位取反 | ~a | |
左移 | a << b | a左移b位,就是a乘以2的b次方 |
右移 | a >> b | a右移b位,就是a除以2的b次方 |
需要注意它与逻辑运算的区分。
功能 | 逻辑运算符 |
---|---|
逻辑与 | a && b |
逻辑或 | a |
逻辑非 | !a |
在进行嵌入式开发时,常会有对寄存器进行位运算的场景。通过使用位运算,可以提高程序的执行效率,但会使代码变得生涩难懂。通过设置合适的位掩码,我们可以封装一些常用的位操作方法,如复位、置位、翻转、取值等。以下是四种比较常用位运算的函数实现。
源码说明
/**
* @brief 将某个字节的某一位 置0
* @param byte: byte need to be operated
* @param bitNum: number of the bit
* @retval result of the operation
*/
uint8_t BitOpt_ResetBit(uint8_t byte, uint8_t bitNum)
{
byte &= ~(0x01<<bitNum);
return byte;
}
/**
* @brief 将某个字节的某一位 置1
* @param byte: byte need to be operated
* @param bitNum: number of the bit
* @retval result of the operation
*/
uint8_t BitOpt_SetBit(uint8_t byte, uint8_t bitNum)
{
byte |= (0x01<<bitNum);
return byte;
}
/**
* @brief 将某个字节的某一位 翻转
* @param byte: byte need to be operated
* @param bitNum: number of the bit
* @retval result of the operation
*/
uint8_t BitOpt_ReverseBit(uint8_t byte, uint8_t bitNum)
{
byte ^= (0x01<<bitNum);
return byte;
}
/**
* @brief 获取某个字节的某一位的值
* @param byte: byte need to be operated
* @param bitNum: number of the bit
* @retval result of the operation (0 or 1)
*/
uint8_t BitOpt_GetBit(uint8_t byte, uint8_t bitNum)
{
return (byte & (0x01<<bitNum))>>bitNum;
}