位操作列表
符号 | 中文名 | 英文 |
---|---|---|
& | 按位与 | bitwise AND |
| | 按位或 | Bitwise OR |
^ | 按位异或 | Bitwise XOR |
<< | 按位左移 | Shift Left |
>> | 按位右移 | Shift Right |
~ | 按位取反 | Bitwise NOT |
所有位运算的规则
低位:靠后的位
高位:靠前的位
低位对齐,高位补0, 对每一位分别执行计算规则(下文说)
00 10 11 10 (运算数1)
00 00 00 11 (运算数2)
-----------------------------------------
00 00 00 10 (运算结果)
一、按位与
1.计算规则
0 & 0 = 0;
0 & 1 = 0;
1 & 1 = 1;
不同大小的数据位操作的原则,低位对齐,高位补零。
2.用途
可用作数位屏蔽
00 10 11 10 (运算数1)
00 00 00 11 (屏蔽遮罩)00 00 00 10 (屏蔽结果)
屏蔽除了最后两位以外的其他位
二、按位或
1.运算规则
1 | 1 = 1
1 | 0 = 1
0 | 0 = 0
一个是1就是1
2.用途
定向修改数位为1
10 00 01 10 (运算数1)
00 00 00 01 (遮罩)
10 00 01 11 (结果)
三、按位移动
1.运算规则
原则是高位舍弃,低位补零。
符号位不参与计算!!!!没有溢出检查!!
计算 2<<2的结果如下,右移同理
00 00 00 10 (运算数1)
00 00 10 00 (左移2位结果)
a << k = a * 2k
a >> k = a * 2(-k)
四、按位取反
1.运算规则
让每一位0变1,1变0
~1 = 0
~0 = 1
2.用途
取反的一个用途可以是获取补码反码等,笔者并不知道太现实的用途
五、按位异或
1.运算规则
不同为1,相同为0
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
2.用途
1.对称加密
#include<stdio.h>
int main()
{
int a = 1000;
int key = 95689792966;
//每两次运算回到原样
a = a ^ key;
printf("按Key加密结果:%d\n",a);
a = a ^ key;
printf("按Key解密结果:%d\n",a);
}
两次就回到正常
2.交换数值
#include<stdio.h>
int main()
{
int a = 30;
int b = 50;
printf("a=%d b=%d\n", a, b);
//交换过程
//a = (a^b)
// b = b^(a^b) = a
// a = (a^b)^a
a^=b;
b^=a;
a^=b;
printf("a=%d b=%d\n", a, b);
return 0;
}