c语言-位运算符

1、位运算符介绍

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

       a、运算规则

       b、十进制快速转二进制

       c、原码  反码  补码   --- 涉及负数计算

       &:按位与

       |:按位或

       ^:按位异或

       ~:按位取反

       <<:按位左移

       >>:按位右移

2、按位与

       符号:&

       格式:数据1 & 数据2

       规则:将数据转成 二进制补码

             按照低位对齐,对不齐前面补0

                "11,00

       场景:

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

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

              总结规律:

                     如果想将一个数据的第n位置0,只需要将 数据 & (第n位是0其他位都是1的数)

                     如果想将一个数据的第n位和第n+1置0,只需要将 数据 & (第n位和第n+1位是0其他位都是1的数)

例子                        将25的第4为置0

                     printf("%d",25 & 0b11101111);  // 9

                     将0xff的第4位和第5位置0

                     printf("%d",0xff & 0b11001111); // 207

3、按位或

       符号: |

       格式: 数据1 | 数据2

       规则:将数据转成 二进制补码

             按照低位对齐,对不齐前面补0

                有1则1,全00"

       场景:

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

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

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

  例子:                      将10的第4位置1

                     printf("%d\n",10 | 0b00010000);

                     将10的第4位和第5位都置1

                     printf("%d\n",10 | 0b00110000);

                     printf("%d\n",10 | 0x30);

4、按位异或

       符号: ^

       格式: 数据1 ^ 数据2

       规则:将数据转成 二进制补码

             按照低位对齐,对不齐前面补0   

                 "不同为1,相同为0"

       场景:

             不知道数据是多少是可以用^(按位异或) 推数据

    例子         10 ^ 25 == 19

                     10 ^ 19 == 25

                     25 ^ 19 == 10

5、按位取反

       符号:~

       格式:~数据

       规则:将数据转成 二进制补码

                按照数据类型的位数进行补齐

                “所有位01,10“(符合号也变)

                注意数据类型

例子

        int a = 7;     ~a

       0000 0000 0000 0000 0000 0000 0000 0111

       ~   1111 1111 1111 1111 1111 1111 1111 1000

unsigned int b = ~a;  // b就是很大的正数

              int c = ~a;           // c == -8

              unsigned char d = ~a; // 1111 1000   248

              char e = ~a;          // 1111 1000   -8

       场景:

              辅助作用 置0 

         例子:       将25的第4为置0

              printf("%d",25 & 0b11101111);  // 9

              printf("%d",25 & ~(0b00010000));  // 9

6、按位左移

       符号:<<

       格式:数据 << 位数

       规则:将数据转成 二进制补码

                所有位整体左移,低位补0,高位溢出舍弃

                10 << 0 == 10

                10 << 1 == 20

                10 << 2 == 40

                n << m  得到的结果就是 n * 2 ^ m

                左移一位扩大一倍就是*2   

       场景:

              打辅助:

              可以将1放在任意位置

                1 << 0 == 0b1

              1 << 1 == 0b10

              1 << 2 == 0b100

例子:

                将10的第4位置1

              printf("%d", 10 | 0b00010000);

              printf("%d", 10 | (1 << 4));

              相邻的两位置1

              0b11 << 0  == 0b11   ---- 3 << 0

              0b11 << 1  == 0b110  ---- 3 << 1

              0b11 << 2  == 0b1100 ---- 3 << 2   

        7、按位右移

       符号: >>

       格式:数据 >> 位数

       规则:将数据转成 二进制补码

                     所有位整体右移,低位溢出舍弃,高位补符号位上的数据

              10 >> 0 == 10

              10 >> 1 == 5

              10 >> 2 == 2

              右移1位缩小1倍,不是严格意义上的1倍。

       场景:

              一般用于数据分割

              int a = 0x12345678;

            将a每8位分割,分割成四个数 0x12   0x34 0x56 0x78

              unsigned char ch1 = a;       //ch1 == 0x78  char是一个字节,将int类型的数据存放在char类型上,存储的是低八位的数据

              unsigned char ch2 = a >> 8;  // ch2 == 0x56

总结:

       & -- 0        11,有00

       | -- 1         00,有11

       ^ --             不同为1,相同为0

       ~ -- 打辅助      所有位01,10

       << -- 打辅助     所有位整体左移,低位补0,高位溢出舍弃  

       >> -- 数据分割   所有位整体右移,低位溢出舍弃,高位补符号位上的数据

   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值