C语言中的位运算符
位运算符直接对 bit 位进行操作,其效率最高,只能用于整数类型。
(1)左移、右移运算符注意点
-
左操作数必须为整数类型
char、short是左操作数的类型时, 会被隐式转换成 int 后进行移位操作 -
右操作数的范围必须为 [0,31] //四字节,一个字节8位
-
左移运算符 << 将运算数的二进制位左移
规则:高位丢弃,低位补0 -
右移运算符 >> 将运算数的二进制位右移
规则:高位补符号位,低位丢弃
小程序:用位操作符交换两个变量的值
#include <stdio.h>
#define SWAP(a,b) \
{ \
a = a^b; \
b = a^b; \ b = a^b^b
a = a^b; \ a = a^b^a
}
int main()
{
int a = 1;
int b = 2;
printf("%d\n", a);
printf("%d\n", b);
SWAP(a, b);
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
异或运算的性质:
- 任意一个变量x与其自身进行异或运算,结果为0
- x与0进行异或运算,结果不变
- 异或运算具有可结合性,
a^b^c = (a^b)^c = a^(b^c)
- 异或运算具有可交换性,即
a^b = b^a
单目运算符 >算数运算符 >关系运算符 > 位运算符 > 逻辑运算 > 赋值运算符
++ +、 -、 * >、< &、^、| &&、|| =
(2)位运算和逻辑运算的区别
— 位运算没有短路规则,每个操作数都参与运算
— 位运算的结果为整数,而不是0或1
— 位运算的优先级高于逻辑运算优先级