位运算是针对二进制位的运算。我们做位运算的时候需要使用无符号整型变量,但是我们不关注整个整型变量的值,而是关注变量中的一些二进制位的值。
对补码感兴趣的同学可以看我发的文档,补码是为了N+-N = 0
1.左移和右移
左移示例
#include <stdio.h> int main(){ char a = 1;//0000 0001 a = a<<1;//将变量a中所有的二进制位向高位移动1位,高位溢出,低位补0 printf("%d\n", a);//0000 0010 十进制2 a = a<<2;//将变量a中所有的二进制位向高位移动2位,高位溢出,低位补0 printf("%d\n", a);//0000 1000 十进制8 return 0;}
右移示例
#include <stdio.h> //右移,低位溢出,整数的高位补0,负数的高位补1 int main(){ unsigned char a = 8;//unsigned是无符号的意思,只有整数没有负数 0000 1000 a = a>>1;//0000 0100 printf("%d\n", a);//4 a = a>>2;//0000 0001 printf("%d\n", a);//1 return 0;}
2.按位取反
~
将变量中所有的位,1变成0,0变成1#include <stdio.h> int main(){ unsigned char a = 0x01;//0000 0001 a = ~a;//1111 1110 printf("%#x\n", a);//0xFE return 0;}
3.按位与
& 双目运算 对应的位,有一个为0结果就是0#include <stdio.h> int main(){ unsigned char a = 0xA5;//1010 0101 unsigned char b = 0x8C;//1000 1100 unsigned char c = a&b; //1000 0100 printf("%#x\n", c);//0x84 return 0;}按位与的作用
1)给指定的位写0unsigned char a;a = a&~(1<<n);//将变量a的n位写0#include <stdio.h> int main(){ unsigned char a = 0xA5;//1010 0101 a = a&~(1<<5); /* 1<<5 0010 0000 ~(1<<5) 1101 1111 1010 0101 & ---------------- 1000 0101 */ printf("%#x\n", a);//0x85 return 0;}
2)读取指定位的值if((a&1<<n) == 0){ //a的n位是0 }else { //a的n位是1 }读取示例#include <stdio.h> int main(){ unsigned char a = 0xA5;//1010 0101 int i; for(i = 0;i < 8;i++) { /* 0000 0100 1010 0101& ----------- 0000 0100 */ if((a&1<<i) == 0) { printf("a的%d bit is 0\n", i); //printf("a的2 bit is 0\n"); } else { printf("a的%d bit is 1\n", i); //printf("a的2 bit is 1\n"); } } return 0;}
4.按位或
| 指定的二进制位,写1#include <stdio.h> int main(){ unsigned char a = 0xA5;//1010 0101 a = a|1<<3; /* 0000 1000 1010 0101| ----------- 1010 1101 */ printf("%#x\n", a); return 0;}
5.按位异或
^ 指定位取反 对应的位,相同得0,不同得1
a = a^1<<n;
1010 01010000 1000----------1010 1101#include <stdio.h> int main(){ unsigned char a = 0xA5; a = a^1<<2; /* 1010 0101 0000 0100^ ---------- 1010 0001 */ printf("%#x\n", a); a = a^1<<2; /* 1010 0001 0000 0100^ ---------- 1010 0101 */ printf("%#x\n", a); return 0;}
异或的使用小技巧
//交换两个整数的值,不定义第三个变量 int a = 10, b = 20;a = a^b;b = a^b;a = a^b;printf("%d %d\n", a, b);//20 10