位运算
位运算符是指按bit位来进行的运算。
注意:所有位运算都需要把操作数变成bit序列,然后再按bit位来运算 位运算符要求操作数是
位运算符
运算符 | 名称 | 举例 | 功能说明 |
---|---|---|---|
~ | 位反 | ~a | 将变量 a 中的每一位取反 |
& | 位与 | a & b | 将变量 a 和 b 逐位进行与操作 |
| | 位或 | a | b | 将变量 a 和 b 逐位进行或操作 |
^ | 位异或 | a ^ b | 将变量 a 和 b 逐位进行异或操作 |
<< | 左移 | a << 4 | 将变量 a 中的每一位向左移动4位 |
>> | 右移 | x >> n | 将变量 x 中的每一位向右移动4位 |
-
~ : 按位取反---单目运算符,数据将每一个bit位取反,1变0,0变1
一个字节为例
如:~5 ==> 250;
00000101 ==> 5
11111010 ==> ~5=250
-
&:按位与,两个都为1,结果才为1
1 & 1 == 1
1 & 0 == 0
0 & 0 == 0
0 & 1 == 0
一个字节为例
如:3 & 2 ==> 2
00000011 ==> 300000010 ==> 2
00000010 ==> 3 & 2
- | :按位或,两个都为0,结果才为0
1 | 1 == 1
1 | 0 == 1
0 | 1 == 1
0 | 0 == 0
一个字节为例
如:3 | 2 ==> 3
00000011 ==> 300000010 ==> 2
00000011 ==> 3 | 2
- ^ : 按位异或 --- 不同为1,相同为0
1 ^ 0 == 1
0 ^ 1 == 1
0 ^ 0 == 0
1 ^ 1 == 0
一个字节为例
如:3 | 2 ==> 1
00000011 ==> 300000010 ==> 2
00000001 ==> 3 ^ 2
-
<< : 左移,按bit位往左移动
假设该数 为 x
x << n :将 x 的bit序列 整体左移 n个bit 位
高位左移后,直接丢弃
低位空出n 个bit 位 全部补0
一个字节为例
如:3 << 2 ==> 12 == 3*2^2
00000011 ==> 300001100 ==> 3<<2
-
>> : 右移
假设该数 为 x
x >> n :将 x 的bit序列 整体右移 n个bit 位
低位右移后,直接丢弃
高位空出n 个bit 位 补什么,看是有无符号 无符号 :高位补0 有符号:高位补符号位
一个字节为例
如:12 >> 2 ==> 12 == 3/2^2
00001100 ==> 1200000011 ==> 12<<2
位运算应用
例题
编写一段代码计算一个int类型的数有多少位1。
我们知道,在位运算过程中,与1进行按位与只有当两者都是1时结果为1
1&1=1;
否则都为0,我们可以通过这一特性来计算,代码如下:
#include <stdio.h> int main() { int n; scanf("%d",&n); int count = 0; for(int i=0;i<sizeof(int)*8;i++) { n = n>>i; if(n&1) count++; } printf("%d\n",count); return 0; }
位运算在加密解密的运用也十分重要,一般通过异或运算达到这种效果。