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

8 篇文章 1 订阅
7 篇文章 0 订阅

为什么需要按位操作?
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;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值