位操作列表

符号中文名英文
&按位与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;
}

请添加图片描述