& 与运算 都是1才为1
1100 & 1010 = 1000
!或运算 有1为1
1100 | 1010 = 1110
~ 取反 1变0 0变1
~1100 = 0011
^ 异或 相同为0 不同为1
1100 ^ 1010 = 0110
<< 左移 左移补0 移动几位右侧补几个0
char a = 3; // 二进制表示为 00000011
char result = a << 2; // 左移2位
计算过程:
00000011 << 2 = 00001100
结果:
result = 12 // 十进制 1
>> 右移 右移补符号位
右移运算会将位向右移动指定的位数,左边用符号位(对于有符号类型)或0(对于无符号类型)补齐。每右移一位,相当于除以2。
示例 1:无符号右移
unsigned char a = 12; // 二进制表示为 00001100
unsigned char result = a >> 2; // 右移2位
计算过程:00001100 >> 2 = 00000011
result = 3 // 十进制 3
示例 2:有符号右移(算术右移)
char a = -16; // 二进制表示为 11110000(补码表示法)
char result = a >> 2; // 右移2位
计算过程:11110000 >> 2 = 11111100 // 符号位补1
结果:
result = -4 // 十进制 -4
用例:采用异或运算 交换两个数 节省空间
#include<stdio.h>
int main()
{
int a = 69;
int b = 72;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
结果: