C/C++中变量按位操作

为什么需要按位操作?
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;

你可能感兴趣的:(C++\QT,单片机,计算机原理,c语言,c++,位操作)