1 产生随机数
include<time.h> //time函数的头文件
//设置随机数种子,time(NULL)获取当前时间
srand(time(NULL));
//产生随机数据的函数rand()
cout<<rand()<<endl;
2 位运算(二进制位运算)
2.1 &按位与
语法:全1为1,有0为0
特点:和1相与保持不变,和0相与为0
场景:将指定位清0

案例一:data为1字节 将data的第3,4为清0 ,其他位保持不变,按位与尽量写成16进制
unsigned char data;
data = data &1110 0111; //计算机误认10进制
data =data &0xe7; //ok
data &=0xe7;
2.2 |按位或
语法:有1为1,全0为0
特点:和1或 置1,和0或 保持不变
场景:将指定位 置1

案例二:data为1字节将data的第5,6为置1其他位保持不变
data = data | 0110 0000
data = data |0x60;
data |=0x60;
2.3~按位取反
语法:0变1 1变0
~1100 0011 ==0011 1100
2.4 ^按位异或
语法:相同为0 不同为1
特点:和1异或 取反, 和0异或 保持不变
场景:将指定位发生翻转

2.5 左移<<:
左边丢弃 右边补0
移动的位数 不要超过 自身位的宽度
2.6 右移>>:
右边丢弃 左边补0(补1)
算术右移、逻辑右移都是编译器决定,用户无法决定
无符号数:右边丢弃 左边补0
有符号数:正数:右边丢弃左边补o
负数:右边丢弃左边补0(逻辑右移)
负数:右边丢弃左边补1(算术右移)
案例一:编写代码测试 编译器的右移方式
short data = -10; //计算机存的补码 1111 1111 1111 0110
data = data>>4;
cout<<bitset<16>(data)<<endl; //1111111111111111 算数右移
2.7位运算综合应用
案例一:data为1字节,将data的第3,4位清0,其他位保持不变
data &= ~(0x01<<4 | 0x01<<3); //取反和按位与等于清0
案例二:data为1字节 将data的第5,6位置1 其他位保持不变
data |= (0x01<<6 | 0x01<<5);
2.8 三目运算符 ? :
表达式1?值1:值2
如果表达式1为真整个表达式的值为值1 (引用)
如果表达式1为假整个表达式的值为值2(引用)
cout<<(10>20? 10:20);
int data1 = 10; //C++三目运算符的结果可以用来赋值
int data2 = 20;
(data1>data2?data1:data2)=200;
cout<<"data1 = "<<data1<<endl; //10
cout<<"data2 = "<<data2<<endl; //200
}
2.9 自增自减运算符
注意:
1 不管是i++,++i如果是独立的一条语句,两者没区别
2 ++在右边 先使用 后加减
j = i++; //j=i;i++;
3 ++在左边 先加减 后使用
j= ++i; //i++;j=i