3.2 位运算两大公式

位运算两大公式:

1.将数据的某个bit位清0,其它位保持不变(连续多位或一位,若不连续则多次使用一位即可)

A & = ~(B<< C) 等价于 A = A & ~ (B << C) 

        A:要修改的数据 

        B:要修改的位数对应的全为1时的值 

        C:要修改的起始位(从低位到高位数) 

        要修改的位数         2进制         16进制

                1                       1                 0x1

                2                       11               0x3

                3                       111             0x7

                4                      1111            0xF

                5                     11111           0x1F

                6                    111111          0X3F

                7                   1111111         0X7F

                8                 11111111         0XFF

例如:

int a = 0x5F // 0101 1111

目标:将a从第1位开始,连续3个bit位全清0,其它保持不变

        a = a & ~ (0x7 << 1)

        推导:

        1.0x7 << 1

                0000 0000 0000 0000 0000 0000 0000 1110

        2.~(0x7 << 1)

                1111 1111 1111 1111 1111 1111 1111 0001

        3.a的2进制

                0000 0000 0000 0000 0000 0000 0101 1111

        4.a & ~ (0x7 << 1)

                0000 0000 0000 0000 0000 0000 0101 0001


2.将数据某个bit位 置1,而其它位保持不变:

A | = (B << C)        等价于 A = A | (B << C)

目标:将a从第1位开始,连续3个bit的 0 全置为1,其它保持不变

        a = a|(0x7 << 1)

3.其中B可以换为指定数

a = 0xabcd1234; // 目标:将其中cd12变成12cd,其它位置不变

a = a & ~(0xFFFF << 8); // 现将a从第8位开始,连续16位全部清零,即将cd12清零

a = a | (0x12cd << 8); // 然后将0x12cd放置到刚才清零的位置上

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值