位运算有位与、位或、位异或、位取反,位左移、位右移首先看下位与
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.注意位溢出问题