一、基本概念
按位取反是一种操作,用于改变二进制数每一位的值,使0变成1,1变成0。
在C语言中,按位取反使用 ~ 符号进行表示。
int a = 10; //a的二进制表示为 0000 1010 int b = ~a; //按位取反后,b的二进制表示为 1111 0101
二、按位取反的应用
1. 二进制运算
按位取反可以用于逻辑运算中的“非”操作。
int a = 10; //a的二进制表示为 0000 1010 int b = ~a; //按位取反后,b的二进制表示为 1111 0101 /* * 在逻辑运算中,0表示false,1表示true * 所以,a = 10表示true,~a = -11也表示true * a的二进制表示为 0000 1010,b的二进制表示为 1111 0101 * 因为-11和-1、-10等是true,所以b的值为true */ if (~a) { printf("true"); } else { printf("false"); }
2. 原地交换数据
按位取反还可以用于原地交换两个数的值。
int a = 10; //a的二进制表示为 0000 1010 int b = 20; //b的二进制表示为 0001 0100 a = a ^ b; //a的二进制表示为 0001 1110 b = a ^ b; //b的二进制表示为 0000 1010,即10 a = a ^ b; //a的二进制表示为 0001 0100,即20
三、按位取反注意事项
1. 数据类型限制
按位取反只能作用于整型数据。
float a = 10.0; float b = ~a; //错误,浮点型数据无法使用按位取反操作
2. 运算符优先级
按位取反的运算符优先级比较低,所以需要注意使用括号进行运算控制。
int a = 10; int b = ~a + 1; //错误,~a的优先级比+低,需要使用括号改变优先级 int c = (~a) + 1;
3. 正负号问题
在按位取反一般情况下,会将数据的符号改变。对于整数来说,取反后最高位的值为1(负数的符号位);对于负数来说,取反后最高位的值变为0(正数的符号位)。
int a = 10; //a的二进制表示为 0000 1010 int b = ~a; //按位取反后,b的二进制表示为 1111 0101,即-11 int c = ~b; //再次取反后,c的二进制表示为 0000 1010,即10
四、示例代码
#includeint main() { int a = 10; int b = ~a; printf("a = %d\n", a); printf("~a = %d\n", b); if (~a) { printf("true\n"); } else { printf("false\n"); } int c = 20; printf("swap before: a=%d b=%d\n", a, c); a = a ^ c; c = a ^ c; a = a ^ c; printf("swap after: a=%d b=%d\n", a, c); return 0; }