文章目录按位与按位或|按位异或^按位取反~左移右移在C语言中位操作符是直接对整数的二进制位进行操作的工具。按位与按位与操作符用于对两个整数的对应二进制位进行与运算。其运算规则是当两个对应的二进制位都为1时结果位才为1否则结果位为0。计算3 5的结果3 : 00000011 5 : 00000101 3500000001 即十进制的1#includestdio.hintmain(){inta3;intb5;intresultab;printf(%d %d %d\n,a,b,result);return0;}运行结果3 5 1按位与操作常用于清零特定位、获取特定位等操作。例如要获取一个整数的最低位只需将该整数与1进行按位与运算。x: xxxxxxxx 1: 00000001 1x 0000000x按位或|按位或操作符|对两个整数的对应二进制位进行或运算。运算规则是当两个对应的二进制位中至少有一个为1时结果位为1否则结果位为0。以3 | 5为例3: 00000011 5: 00000101 3|5:00000111 即十进制的7。代码示例#includestdio.hintmain(){inta3;intb5;intresulta|b;printf(%d | %d %d\n,a,b,result);return0;}运行结果3 | 5 7按位或操作可用于设置特定位。例如要将一个整数的最低位置为1可将该整数与1进行按位或运算。x : xxxxxxxx 1: 00000001 1|xxxxxxxx1按位异或^按位异或操作符^对两个整数的对应二进制位进行异或运算。运算规则是当两个对应的二进制位不同时结果位为1当两个对应的二进制位相同时结果位为0。计算3 ^ 53: 00000011 5: 00000101 3^500000110 即十进制的6代码示例#includestdio.hintmain(){inta3;intb5;intresulta^b;printf(%d ^ %d %d\n,a,b,result);return0;}运行结果3 ^ 5 6按位异或操作有一些特殊的用途比如不使用临时变量交换两个整数的值以及判断两个数是否相等当两个数异或结果为0时两数相等。交换两个整数10 1010 2010100 a a ^ b; // a 10 ^ 20 30 (11110) b a ^ b; // b 30 ^ 20 10 ( 1010) a a ^ b; // a 30 ^ 10 20 (10100)按位取反~按位取反操作符~对一个整数的每个二进制位进行取反操作即0变为11变为0。注意按位取反操作符是单目运算符只需要一个操作数。对于有符号整数其取反结果会受到符号位的影响。以~3为例在32位系统中3: 00000000 00000000 00000000 00000011 ~3: 11111111 11111111 11111111 11111100 这是一个负数的补码形式对应的十进制数为-4。代码示例#includestdio.hintmain(){inta3;intresult~a;printf(~%d %d\n,a,result);return0;}运行结果~3 -4按位取反操作可用于生成与原数相反的位模式在某些底层驱动开发中会用到。左移左移操作符将一个整数的二进制位向左移动指定的位数。移动时右边空出的位用0填充左边超出的位被丢弃。例如3 13: 00000011 31: 00000110 即十进制的6。代码示例#includestdio.hintmain(){inta3;intresulta1;printf(%d 1 %d\n,a,result);return0;}运行结果3 1 6左移操作相当于将原数乘以2的n次方n为移动的位数在需要快速计算乘法时可以使用但要注意溢出的问题。右移右移操作符将一个整数的二进制位向右移动指定的位数。对于无符号整数左边空出的位用0填充对于有符号整数不同的编译器处理方式可能不同有的用符号位填充算术右移有的用0填充逻辑右移在大多数编译器中采用算术右移。以3 1为例3: 00000011 31:00000001 即十进制的1代码示例#includestdio.hintmain(){inta3;intresulta1;printf(%d 1 %d\n,a,result);return0;}运行结果3 1 1右移操作相当于将原数除以2的n次方n为移动的位数同样要注意数据的符号和精度问题。