位运算
C/C++ 提供了6种位运算。
& | 按位与(双目) |
| | 按位或(双目) |
^ | 按位异或(双目) |
~ | 按位非(单目) |
<< | 左移(双目) |
>> | 右移(双目) |
1.
通常用来将某变量中的某些位清0且同时保留其他位不变。\
也可以用来获取某变量中的某一位。
n &= 0xf0 means n = n&0xf0;
&=
2.
|=
3.
^=
将某变量中的某些位取反,且保留其他位不变。
eg. 将int型的低8位取反,而其余位不变
n ^= 0xff;
重要特点1: (a^b=c)---> (( c^b = a ) 且 (c^a = b)); 可以应用在最简单的\
加密和解密。
重要特点2:交换2个数。
int a = 5,b = 7;
a ^= b;
b ^= a;
a ^= b;
4.
<<=
a << b
a的值不发生改变。
左移1位,等于乘以2,左移n位,等于乘以pow(2,n). 但是左移操作的速度比乘法运算 \
的操作快很多很多。
5.
>>=
- a >> b
- a的值不发生改变。
- 对于有符号数,如long, int, short, char类型变量,在右移时,符号位(即最高位)将一起移动,\
- 并且大多数C/C++编译器规定,如果原符号位位1,则右移时高位就补充1,原符号位为0,\
- 则右移时高位就补充0.
实际上,右移n位,就相当于左操作数除以pow(2,n),并且将结果往小里取整。
eg. 这是一个规律,不是规定。
-25>>4 = -2
-2>>4 = -1
18>>4 = 1
#include <stdio.h>
int main()
{
int n1 = 15;
short n2 = -15;
unsigned short n3 = 0xffe0;
char c = 15;
n1 = n1>>2;
n2 >>= 3;
n3 >>= 4;
c >>=3;
printf("n1=%d,n2=%d,n3=%d,c=%x\n",n1,n2,n3,c);
return 0;
//输出结果:n1=3,n2=-2,n3=4094,c=1
}
思考题:
有两个int型的变量a和n(0<=n<=31),要求写出一个表达式,这个表达式的值和a的第n位相同。
(a>>n) & 1
当然这里的第0位,第1位是哪一位自己要想想清楚。
当0<=n<31时,还可以:(a&(1<<n)) >> n
位运算的速度优势那是超级棒的了!!!