位运算符

位运算符

位运算符的介绍

进行位运算的时候要将数据转成二进制补码进行运算符

按位与

符号:&

格式:数据1&数据2

规则:将数据转成二进制补码,按照低位对齐,对不齐前面补0

       “全1为1,有0则0”

例:10&25  ---char 型数据 ----8位

    0000 1010

    0001 1001

&   0000 1000 ---8

场景:将一个数据的某一位或者某几位置0

总结规律:如果想将一个数据的第n位置0,将数据&(第n位是0其他位都是1的数);如果想将一个数据的第n位和n+1置0,只需将数据&(第n位和n+1位是0其他位都是1的数)

按位或

符号:|

格式:数据1|数据2

规则:将数据转成二进制补码,按照低位对齐,对不齐的前面补0

       有1则1,全0为0

例:10|25 ---char型 –8位

   0000 1010

   0001 1001

|  0001 1011 ---27

场景:将一个数据的某一位或者某几位置1

总结规律:如果想将一个数的第n位置1,只需要将数据|(第n位是1,其他位都是0的数),如果想将一个数据的第n位和n+1置1,只需要将数据|(第n位和n+1位是1其他位都是0的数)

按位异或

符号:^

格式:数据1^数据2

规则:将数据转成二进制补码,按照低位对齐,对不齐前面补0

       不同为1,相同为0

例10^25

 0000 1010

 0001 1001

 0001 0011 ---19

场景:推数据

按位取反

符号:~

格式:~数据

规则:将数据转成二进制补码,按照数据类型的位数进行补齐

   所有位0变1,1变0

场景:辅助作用 置0

按位左移

符号:<<

格式:将数据转成二进制补码,所有位整体左移,低位补0,高位溢出舍去

场景:辅助作用,可以将1放在任意位置

按位右移

符号:>>

格式:数据>>位数

规则:将数据转成二进制补码,所有位整体右移,低位溢出舍弃,高位补符号位上的数据

场景:一般用于数据的分割

位运算符的应用

置1:|

例:将a的第4位置1,其他位不变

           a |   == 

          

           ???? ???? ???? ???? ???? ???? ???? 10??

       |   0000 0000 0000 0000 0000 0000 0001 0000

           ???? ???? ???? ???? ???? ???? ???1 10??

          

           a | (1 << 4)

          

           将a的第4位置1,其他位不变

将a的第4位和第5位同时置1,其他位不变

           ???? ???? ???? ???? ???? ???? ???? ????

       |   0000 0000 0000 0000 0000 0000 0011 0000

           ???? ???? ???? ???? ???? ???? ??11 ????

          

          a |= (3 << 4);

置0:&

将a的第4位置0,其他位不变

      

           ???? ???? ???? ???? ???? ???? ???? 10??

       &   1111 1111 1111 1111 1111 1111 1110 1111

           ???? ???? ???? ???? ???? ???? ???0 10??

          

               a & (0b11111111111111111111111111101111) 

           变1:a & ~(0b00000000000000000000000000010000);

           变2:a & ~(1 << 4);

          

          a = a & ~(1 << 4);    或者 a &= ~(1 << 4);

判断某一位是0还是1

判断a的第5位是0还是1;

      

           ???? ???? ???? ???? ???? ???? ??1? ????

       &   0000 0000 0000 0000 0000 0000 0010 0000  

           0000 0000 0000 0000 0000 0000 0010 0000  

          

           a & (1 << 5);

          

           如果结果 != 0

           {

              对应位是1

           }

           否则

           {

              对应位上是0

           }

置01或者10

思路1:分开置0置1

思路2:先将这两位清0,然后再重置01或者10

将a的第5位和第4位置01

           将a的第5位和第4位置00     a &= ~(3 << 4);

           将a的第5位和第4位重置01   a |= (1 << 4);

          

       将a的第5位和第4位置10

           将a的第5位和第4位置00     a &= ~(3 << 4);

           将a的第5位和第4位重置10   a |= (1 << 5);  或者 a |= (2 << 4);

位翻转

将a的第4位翻转,0变1,1变0,其他位不变

???? ???? ???? ???? ???? ???? ???0 10??

       ^   0000 0000 0000 0000 0000 0000 0001 0000

           ???? ???? ???? ???? ???? ???? ???1 10??

          

          

           ???? ???? ???? ???? ???? ???? ???1 10??

       ^   0000 0000 0000 0000 0000 0000 0001 0000     

           ???? ???? ???? ???? ???? ???? ???0 10??

          

       规则:

           将a的第4位翻转,0变1,1变0,其他位不变

          

          a = a ^ (1 << 4); 或者 a ^= (1 << 4);

总结:

前提:第几位置0或者置1是从最低位作为第0位开始数

   

    ①、将a的第n位置1,公式:a |= (1 << n);

       例如:将端口8配置成开漏模式:GPIO8->OTYPER  |= (1 << 8);      

   

    ②、将a的第n位和第n+1位同时置1,公式:a |= (3 << n);

    ③、将a的第n位置0 ,公式: a &= ~(1 << n);

   

    ④、将a的第n位和第n+1位同时置0,公式:a &= ~(3 << n);

   

    ⑤、判断a的第n位是0还是1,公式:a & (1 << n) 看结果,如果结果!=0 ,第n位是1,否则第n位是0

⑥、将a的第n+1位和第n位置01或者10

       先清00                    a &= ~(3 << n);

       在重置 01 或者 10         a |= (1 << n);   或者 a |= (2 << n);

      

⑦、将a的第n位0变1,1变0;

       a ^= (1 << n);   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值