为什么需要按位操作?
1、在嵌入式开发中,寄存器需要按位操作,如io控制;
2、一些组合配置的实现,如下是qt的源代码:
枚举定义为1、2、4、8…,其实就是占用一个配置变量中不同的位,方便两个位之间组合以及单独设置。
看最后一行: AlignCenter = AlignVCenter | AlignHCenter,就是组合配置
enum AlignmentFlag {
AlignLeft = 0x0001,
AlignLeading = AlignLeft,
AlignRight = 0x0002,
AlignTrailing = AlignRight,
AlignHCenter = 0x0004,
AlignJustify = 0x0008,
AlignAbsolute = 0x0010,
AlignHorizontal_Mask = AlignLeft | AlignRight | AlignHCenter | AlignJustify | AlignAbsolute,
AlignTop = 0x0020,
AlignBottom = 0x0040,
AlignVCenter = 0x0080,
AlignBaseline = 0x0100,
// Note that 0x100 will clash with Qt::TextSingleLine = 0x100 due to what the comment above
// this enum declaration states. However, since Qt::AlignBaseline is only used by layouts,
// it doesn't make sense to pass Qt::AlignBaseline to QPainter::drawText(), so there
// shouldn't really be any ambiguity between the two overlapping enum values.
AlignVertical_Mask = AlignTop | AlignBottom | AlignVCenter | AlignBaseline,
AlignCenter = AlignVCenter | AlignHCenter
};
3、一些节省空间的开关控制,如一个32位的变量,即可保存32个开与关的控制,且通过位操作可做到相互不影响。(其实和1中说的一样)
下面对一个32位的变量进行操作,写入、读取其中的第5位(从右边数)。
一、按位写入1
uint32_t writeBit (1 << 5) // 第5位的掩码
uint32_t value = 0x12341234;
// 设置第5位为1
value |= writeBit;
原理就是原值与掩码… 00010000进行按位相与,与0相交的位还是等于原来的值,与1相交的位则变为1。
二、按位写入0
uint32_t writeBit (0 << 5) // 第5位的掩码
uint32_t value = 0x12341234;
// 设置第5位为1
value &= ~writeBit;
原理就是按位取反相交,掩码… 00010000取反后为…11101111,按位相交,与为1的位相交保持原值,与为0的位相交为0。
三、按位读
uint32_t readBit (0 << 5) // 第5位的掩码
uint32_t value = 0x12341234;
// 设置第5位为1
bool readvalue = (value & readBit) != 0;