• C语言----位运算(进阶篇二十六)


      作用

        在小内存时代,经常把一个字节分成好几份来用,以达到节约内存的目的。

        现在经常用于网络数据传输,单片机领域……。

        

        注意:

          ※在进行任何位运算前,首先应将进任何表达式的结果转换成二进制,算完以后再转回原来的进制即可得到结果。

          ※不能对浮点数进行位运算。

      按位与

        格式:二进制&二进制

          如:

            int a=3&5;

           

            记忆方法:在逻辑与运算中,两边的表达式都为真,结果才为真。因此按位与运算时,两个位都为1,结果才为1。

          作用:

            ※清零:要将某一位清零,可将相应的位设置为0,其它位为1,再使用&运算。

            ※取指定位:想取某一位,可将相应的位设置为1,其它位为0,再使用&运算。

      按位或

        格式:二进制|二进制

          如:

            int a=3|5;

         

            记忆方法:在逻辑或运算中,两边的表达式有一个为真,结果就为真。因此按位或运算时,有一个位为1,结果就为1。

           作用:

            ※将某位置1:要将某一位置1,可将相应的位设置为1,再使用 | 运算

      按位异或

        格式:二进制^二进制

          如:

            int a=3^5;

          

            记忆方法:“异”就是不同的意思,异或实际上是判断两数是否“不同”,如果不同就为真。因此按位异或时,两数不同,结果为1。

          定理:

            1、任何数与自己异或都为0

            2、任何数与0异或值不改变

          作用:

            ※翻转位:要将某一位翻转,可将相应的位置1,第一次用 ^ 运算,可将其翻转,第二次用 ^ 运算,又可将其转回来。早期的鼠标指针用的就是一种图形异或运算,所以速度非常快。

            ※不用临时变量交换两个值。如a=4,b=5,可用以下语句实现互换:

              a=a^b;

              b=b^a;

              a=a^b;

            用等量代换法分析:a=a^b,那么b=b^a相当于b=b^(a^b),去括号得b=b^a^b,移项得b=b^b^a,根据定理1得b=0^a,根据定理2得b=a。

            这时候b的值是4,而a只是个中间值。

            a=a^b相当于a=(a^b)^(b^a^b),去括号得a=a^b^b^a^b,移项得a=a^a^b^b^b,根据定理1得a=0^0^b,根据定理2得a=b。

            这时候a的值是5,交换完毕

          程序1

            矩阵异或

    // 26-1异或矩阵.c
    //※翻转位:要将某一位翻转,
    //   可将相应的位置1,第一次用 ^ 运算,可将其翻转,第二次用 ^ 运算,又可将其转回来。
    
    #include <stdio.h>
    
    main()
    {
        //源矩阵
        int a[4][4] =
        {
            {1,2,3,4},
            {1,2,3,4},
            {1,2,3,4},
            {1,2,3,4}
        };
    
        //源矩阵
        /*
        int a[4][4] =
        {
            {8,8,6,6},
            {8,8,6,6},
            {6,6,8,8},
            {6,6,8,8}
        };
        */
    
        //异或矩阵
        int b[4][4] =
        {
            {0,3,3,0},
            {3,0,0,3},
            {3,0,0,3},
            {0,3,3,0},
        };
    
        //输出源矩阵 和 异或矩阵
        printf("输出源矩阵和异或矩阵
    ");
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                printf("%d ", a[i][j]);  //输出源矩阵
            }
            printf("	");
            for (int j = 0; j < 4; j++)
            {
                printf("%d ", b[i][j]);
            }
            printf("
    ");
        }
    
        //输出第一次异或后的矩阵
        printf("第一次异或后的矩阵:
    ");
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                a[i][j] ^= b[i][j];
                printf("%d ", a[i][j]);
            }
            printf("
    ");
        }
    
        //第二次异或后的矩阵  在次异或就会复原最初始的矩阵
        printf("第二次异或后的矩阵:
    ");
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                a[i][j] ^= b[i][j];
                printf("%d ", a[i][j]);
            }
            printf("
    ");
        }
    }

      按位取反

        格式:~二进制

          如:int a=~3;

          得到11111100,它是个负数。

      左移

        格式:二进制<<要移动的位数

        如:

          int a=3<<2;

          相当于00000011<<2得到00001100

          转成十进制后,a的值为12

        作用:将二进制数左移一定的位数,最右边补0。任何一位移出左边界,自动丢弃。

        ※不越界的左移相当于让变量值乘以2。

      右移

        格式:二进制>>要移动的位数

          如:

            int a=12>>2;

            相当于00001100>>2得到00000011

            转成十进制后,a的值为3

        作用:将二进制数右移一定的位数,最左边补0(或1)。任何一位移出右边界,自动丢弃。

        ※不越界右移相当于让变量值除以2。

        注意:右移比左移要复杂些,如果要移的数为负数,最左边符号位为1,为了不改变此数的符号位,往右移的时候,左边会自动补1。

        位运算的优先级:~ 高于 << >> 高于 & 高于^ 高于 |

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    TiFlash:并非另一个 T + 1 列存数据库
    单图说TDSQL;OceanBase 2.2 事务引擎核心功能;穿云箭2.0版发布;RMAN DUPLICATE配置19C DG;外键上有无索引的影响;MySQL8.0 索引新功能;GaussDB C
    tcpdump 看到 报文长度超过MSS
    TCP 最大段大小(Max Segment Size,MSS) 最大段大小
    Hack The Box——Traceback
    如何设置don't fragment (DF) flag 在socket上? (实际模拟路径 MTU 发现)
    MTU=1500 1460数据为什么要发2次?
    MTU=1500,单个报文段最大值为1448
    MTU 1500 发送1448数据
  • 原文地址:https://www.cnblogs.com/httpcc/p/15490371.html
Copyright © 2020-2023  润新知