C语言笔记5--位运算

位运算有位与、位或、位异或、位取反,位左移、位右移首先看下位与
1、位与

#include<stdio.h>
#include<stdlib.h>
void main()
{
    unsigned char a=12;//二进制表示为:1100
    unsigned char b=10;//二进制表示为:1010
    unsigned char c=a&b;
    printf("%d\n",c);
    system("pause");
}

打印结果为8,按位与只有在两个都为1时才会输出1。利用某一位和1进行位与,结果会等于该位的值,例如:
0&1=0;
1&1=1;
2、按位或

//unsigned char c=a&b;
unsigned char c=a|b;

把代码修改为位或,结果为:15,按位或是只要有一方为1,则结果为1。利用某一位和0进行位或运算,结果会等于该位的值,例如:
1|0=1;
0|0=0;
3、位异或

unsigned char c=a^b;

直接修改代码后,结果为:6,位异或是当两者不同时输出1
利用异或运算进行简单数据加密解密

#include<stdio.h>
#include<stdlib.h>
void main()
{
    unsigned char a=10,b=15;//a=1010 b=1111
    a=a^b;//a=0101
    b=a^b;//b=1010
    a=a^b;//1111
    printf("a=%d,b=%d\n",a,b);
    a=a^b;
    b=a^b;
    a=a^b;
    printf("a=%d,b=%d\n",a,b);
    system("pause");
}

打印结果为:
这里写图片描述
由结果可以知道当两者做了3次异或运算后,两者的值进行了交换,在进行3次异或运算后,值和原来的一样,达到了数据加密解密的过程。
4、按位取反

#include<stdio.h>
#include<stdlib.h>
void main()
{
    unsigned char a=10;//1010
    a=~a;
    printf("a=%d\n",a);
    system("pause");
}

输出结果为:245,按位取反是每一位都反,注意char类型有8位
5、左移、右移

#include<stdio.h>
#include<stdlib.h>
void main()
{
    unsigned char a=10;//1010
    a<<=1;//左移1为后赋值给a
    printf("a=%d\n",a);//10100
    system("pause");
}

打印a=20,注意a并没有溢出char类型的8位,所以a=20。
修改下代码如下:

    unsigned char a=128;//1000 0000
    a<<=1;//左移1为后赋值给a
    printf("a=%d\n",a);//a=0

打印结果为a=0这是因为溢出了8位的原因,
同理:

    unsigned char a=1;
    a>>=1;//改为右移1位
    printf("a=%d\n",a);

结果a=0,也是溢出的问题。
总结位运算注意点:
1.注意符号问题
2.注意位溢出问题

猜你喜欢

转载自blog.csdn.net/weixin_40850689/article/details/81951980