什么是位运算符:
位运算是直接对整型数据的二进制进行运算。
1.按位与(&)
将参加运算的两个数据,按二进制位进行"与"运算。两个都是一则为一
举例: 3 & 5
3 => 0000 0000 0000 0011
5 => 0000 0000 0000 0101
& 0000 0000 0000 0001 转换成十进制也就是1
以下是一个示例代码,演示了如何在C语言中使用位与运算符进行按位与操作:
#include <stdio.h>
int main() {
unsigned int a = 0b10101010; // 第一个操作数
unsigned int b = 0b11001100; // 第二个操作数
unsigned int result; // 按位与结果
// 使用位与运算符进行按位与操作
result = a & b;
printf("a & b = 0x%02X\n", result);
return 0;
}
输出结果为:
a & b = 0x80
在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过位与操作,两个二进制数的对应位分别进行按位与操作,得到的结果是10000000,即0x80。
注意,按位与操作符(&)在两个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。
2.按位或(|)
将参加运算的两个数据,按二进制位进行"或"运算。两个中有一个是一则为一
举例: 3 | 5
3 => 0000 0000 0000 0011
5 => 0000 0000 0000 0101
| 0000 0000 0000 0111 转换成十进制也就是7
以下是一个示例代码,演示了如何在C语言中使用位或运算符进行按位或操作:
#include <stdio.h>
int main() {
unsigned int a = 0b10101010; // 第一个操作数
unsigned int b = 0b11001100; // 第二个操作数
unsigned int result; // 按位或结果
// 使用位或运算符进行按位或操作
result = a | b;
printf("a | b = 0x%02X\n", result);
return 0;
}
输出结果为:
a | b = 0xFE
在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过位或操作,两个二进制数的对应位分别进行按位或操作,得到的结果是11111110,即0xFE。
注意,按位或操作符(|)在两个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。
3.按位取反(~)
将数据,按二进制位进行"取反"运算。零变成一,一变成零
举例: ~6
6 => 0000 0000 0000 0110
~ 1111 1111 1111 1010 转换成十进制也就是-7
以下是一个示例代码,演示了如何在C语言中使用按位取反操作符进行按位取反:
#include <stdio.h>
int main() {
unsigned int a = 0b10101010; // 操作数
unsigned int result; // 按位取反结果
// 使用按位取反操作符进行按位取反
result = ~a;
printf("~a = 0x%02X\n", result);
return 0;
}
输出结果为:
~a = 0x55
在这个示例中,a的二进制表示为10101010。通过按位取反操作,每个二进制位从0变为1,从1变为0,得到的结果是01010101,即0x55。
注意,按位取反操作符(~)在一个整型操作数上执行按位运算,并且按照它的二进制表示进行操作。对于有符号整型数据,按位取反操作符会将其进行补码取反
4.异或(^)
将参加运算的两个数据,按二进制位进行"与"运算。相同为零,不同为一
举例: 3 ^ 5
3 => 0000 0000 0000 0011
5 => 0000 0000 0000 0101
^ 0000 0000 0000 0110 转换成十进制也就是6
以下是一个示例代码,演示了如何在C语言中使用位异或运算符进行按位异或操作:
#include <stdio.h>
int main() {
unsigned int a = 0b10101010; // 第一个操作数
unsigned int b = 0b11001100; // 第二个操作数
unsigned int result; // 按位异或结果
// 使用位异或运算符进行按位异或操作
result = a ^ b;
printf("a ^ b = 0x%02X\n", result);
return 0;
}
输出结果为:
a ^ b = 0x5A
在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过位异或操作,两个二进制数的对应位分别进行按位异或操作,得到的结果是01011010,即0x5A。
注意,按位异或操作符(^)在两个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。
5.同或
将参加运算的两个数据,按二进制位进行"同或"运算。相同为一,不同为零
举例: 3 同或 5
3 => 0000 0000 0000 0011
5 => 0000 0000 0000 0101
1111 1111 1111 0001 转换成十进制也就是-7
下面是一个示例代码,演示了如何使用按位异或和逻辑非运算符实现按位同或操作:
#include <stdio.h>
int main() {
unsigned int a = 0b10101010; // 第一个操作数
unsigned int b = 0b11001100; // 第二个操作数
unsigned int xnor; // 按位同或结果
// 使用按位异或和逻辑非运算符实现按位同或操作
xnor = ~(a ^ b);
printf("a ^ b = 0x%02X\n", xnor);
return 0;
}
输出结果为:
a ^ b = 0x33
在这个示例中,a的二进制表示为10101010,b的二进制表示为11001100。通过按位异或操作,得到的结果是01100110。然后,使用逻辑非运算符将结果取反,得到最终的按位同或结果为00110011,即0x33。
6.左移(<<)
<< : 在一定范围内,每向左移 1 位,就相当于 * 2;
举例: 3 << 5
3 => 0000 0000 0000 0011
<< 0000 0000 0110 0000 转换成十进制也就是 96 = 3 * (2^5) (这里的^代表几次方 不是异或)
以下是一个示例代码,演示了如何在C语言中使用左移位运算符进行左移操作:
#include <stdio.h>
int main() {
unsigned int num = 0b10100101; // 要进行左移操作的数
int shift = 3; // 左移的位数
unsigned int result; // 左移后的结果
// 使用左移位运算符进行左移操作
result = num << shift;
printf("num << %d = 0x%02X\n", shift, result);
return 0;
}
输出结果为:
num << 3 = 0x50
在这个示例中,num的二进制表示为10100101。通过将num向左移动3位,即使用左移位运算符(<<)将num左移3位,得到的结果是01010000,即0x50。
注意,左移操作符(<<)在一个整型操作数上执行按位运算,并且按照它们的二进制表示进行操作。左移的位数表示要将数值向左移动多少位。左移操作会在低位补0,因此左移操作会使得数值变大。
面试题:最高效的计算 2 * 8?
2 << 3 / 8 << 1
7.右移(>>)
>> : 在一定范围内,每向右移 1 位,就相当于 / 2;
举例: 96 >> 5
96 => 0000 0000 0110 0000
<< 0000 0000 0000 0011 转换成十进制也就是 3 = 96 / (2^5)
以下是一个示例代码,演示了如何在C语言中使用右移位运算符进行右移操作:
#include <stdio.h>
int main() {
int num = 0b10100101; // 要进行右移操作的数
int shift = 3; // 右移的位数
int result; // 右移后的结果
// 使用右移位运算符进行右移操作
result = num >> shift;
printf("num >> %d = 0x%02X\n", shift, result);
return 0;
}
输出结果为:
num >> 3 = 0x14
在这个示例中,num的二进制表示为**10100101**
。通过将num向右移动3位,即使用右移位运算符(>>)将num右移3位,得到的结果是00010100,即0x14。
注意,对于有符号整数类型,右移操作会保留符号位并根据符号位填充高位。而对于无符号整数类型,右移操作会简单地在高位补0。