作用
在小内存时代,经常把一个字节分成好几份来用,以达到节约内存的目的。
现在经常用于网络数据传输,单片机领域……。
注意:
※在进行任何位运算前,首先应将进任何表达式的结果转换成二进制,算完以后再转回原来的进制即可得到结果。
※不能对浮点数进行位运算。
按位与
格式:二进制&二进制
如:
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。
位运算的优先级:~ 高于 << >> 高于 & 高于^ 高于 |