ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-01 09:33:24  阅读:134  来源: 互联网

标签:运算 二进制 int 矩阵 C语言 ---- 进阶篇 异或 printf


 

  作用

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

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

    

    注意:

 

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

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

  按位与

    格式:二进制&二进制

      如:

        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("输出源矩阵和异或矩阵\n");
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            printf("%d ", a[i][j]);  //输出源矩阵
        }
        printf("\t");
        for (int j = 0; j < 4; j++)
        {
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }

    //输出第一次异或后的矩阵
    printf("第一次异或后的矩阵:\n");
    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("\n");
    }

    //第二次异或后的矩阵  在次异或就会复原最初始的矩阵
    printf("第二次异或后的矩阵:\n");
    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("\n");
    }
}

 

  按位取反

    格式:~二进制

      如: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。

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

 

标签:运算,二进制,int,矩阵,C语言,----,进阶篇,异或,printf
来源: https://www.cnblogs.com/httpcc/p/15490371.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有