3.2 位运算两大公式

本文介绍了位运算的两种关键操作:清除数据的特定位和设置数据的特定位。通过位与(&)和位或(|)操作,可以精确地修改二进制数据的某一位或连续位,而保持其他位不变。示例中详细展示了如何使用这些公式进行实际操作,并给出了将16进制数中特定部分清零和置1的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位运算两大公式:

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放置到刚才清零的位置上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值