位运算:
特点:速度非常快,如果能在程序中合理使用将大大提高程序运行速度
& 与:只有两个都是1才是1,否则为0
可以把某些位清0且同时保留其他位不变,也可以用来获取某变量中的一位。
eg:
将int型低8位全置成0,其余位不变:
n = n & 0xffffff00 或者n &= 0xffffff00
如果n是short类型:
n &= 0xff00
如何判断一个int型变量n的第7位(从右往左,0开始数)是否为1?
n& 0x80 == 0x80
0x80 = 1000 0000
| 或:只要有一个是1就是1,否则为0
通常用来将变量中的某些位置1且保持其他位不变
eg:
n |= 0xff
0xff: 1111 1111
^ 异或:不相同为1,相同为0
可以用来将变量中的某些位取反,且保留其他位不变。
异或运算的特点是:
- 如果a ^ b = c, 那么就有c ^ b = a以及c ^ a = b(穷举法可证)
可以用来进行最简单的加密和解密。 - 异或运算还能实现不通过临时变量,就能交换两个变量的值:
int a = 5, b = 7;
a = a ^ b;//c = a ^ b
b = b ^ a;//b ^ c = a
a = a ^ b;// c ^ a = b
即实现ab值交换,穷举法可证
eg:
只把后8位取反,前面的其他位不变
n ^= 0xff
对于后8位:1和1异或为0, 0和1异或为1
对于前面的位:1和0异或为1,0和0异或为0
~ 非:0变1, 1变0
<< 左移:a<<b, 将a各二进制全部左移b位后得到的值,左移时,高位丢弃,低位补0,a的值不因运算而改变
左移1位相当于乘2,左移n位相当于乘以2^n。而左移操作比乘法操作快得多。
>> 右移:a>>b, 将a各二进制全部右移b位后得到的值,右移时,低位丢弃,a的值不因运算而改变。对于有符号数,比如long, int, short, char类型变量,往右移时,符号位将一起移动,而且大多数C/C++编译器规定,如果原符号位为1,则右移时高位就补充1,原符号位为0,则右移高位就补充0.
右移n位相当于左操作数除以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