1、位运算符介绍
进行位运算的时候要将数据转成 二进制补码 进行运算符
a、运算规则
b、十进制快速转二进制
c、原码 反码 补码 --- 涉及负数计算
&:按位与
|:按位或
^:按位异或
~:按位取反
<<:按位左移
>>:按位右移
2、按位与
符号:&
格式:数据1 & 数据2
规则:将数据转成 二进制补码
按照低位对齐,对不齐前面补0
"全1为1,有0则0
场景:
将一个数据的某一位或者某几位置0
第几位置0或者置1是从最低位作为第0位开始数
总结规律:
如果想将一个数据的第n位置0,只需要将 数据 & (第n位是0其他位都是1的数)
如果想将一个数据的第n位和第n+1置0,只需要将 数据 & (第n位和第n+1位是0其他位都是1的数)
例子 将25的第4为置0
printf("%d",25 & 0b11101111); // 9
将0xff的第4位和第5位置0
printf("%d",0xff & 0b11001111); // 207
3、按位或
符号: |
格式: 数据1 | 数据2
规则:将数据转成 二进制补码
按照低位对齐,对不齐前面补0
有1则1,全0为0"
场景:
将一个数据的某一位或者某几位置1
总结规律:如果想将一个数的第n位置1,只需要将 数据 | (第n位是1,其他位都是0的数)
如果想将一个数据的第n位和第n+1置1,只需要将 数据 | (第n位和第n+1位是1其他位都是0的数)
例子: 将10的第4位置1
printf("%d\n",10 | 0b00010000);
将10的第4位和第5位都置1
printf("%d\n",10 | 0b00110000);
printf("%d\n",10 | 0x30);
4、按位异或
符号: ^
格式: 数据1 ^ 数据2
规则:将数据转成 二进制补码
按照低位对齐,对不齐前面补0
"不同为1,相同为0"
场景:
不知道数据是多少是可以用^(按位异或) 推数据
例子 10 ^ 25 == 19
10 ^ 19 == 25
25 ^ 19 == 10
5、按位取反
符号:~
格式:~数据
规则:将数据转成 二进制补码
按照数据类型的位数进行补齐
“所有位0变1,1变0“(符合号也变)
注意数据类型
例子
int a = 7; ~a
0000 0000 0000 0000 0000 0000 0000 0111
~ 1111 1111 1111 1111 1111 1111 1111 1000
unsigned int b = ~a; // b就是很大的正数
int c = ~a; // c == -8
unsigned char d = ~a; // 1111 1000 248
char e = ~a; // 1111 1000 -8
场景:
辅助作用 置0
例子: 将25的第4为置0
printf("%d",25 & 0b11101111); // 9
printf("%d",25 & ~(0b00010000)); // 9
6、按位左移
符号:<<
格式:数据 << 位数
规则:将数据转成 二进制补码
所有位整体左移,低位补0,高位溢出舍弃
10 << 0 == 10
10 << 1 == 20
10 << 2 == 40
n << m 得到的结果就是 n * 2 ^ m
左移一位扩大一倍就是*2
场景:
打辅助:
可以将1放在任意位置
1 << 0 == 0b1
1 << 1 == 0b10
1 << 2 == 0b100
例子:
将10的第4位置1
printf("%d", 10 | 0b00010000);
printf("%d", 10 | (1 << 4));
相邻的两位置1
0b11 << 0 == 0b11 ---- 3 << 0
0b11 << 1 == 0b110 ---- 3 << 1
0b11 << 2 == 0b1100 ---- 3 << 2
7、按位右移
符号: >>
格式:数据 >> 位数
规则:将数据转成 二进制补码
所有位整体右移,低位溢出舍弃,高位补符号位上的数据
10 >> 0 == 10
10 >> 1 == 5
10 >> 2 == 2
右移1位缩小1倍,不是严格意义上的1倍。
场景:
一般用于数据分割
int a = 0x12345678;
将a每8位分割,分割成四个数 0x12 0x34 0x56 0x78
unsigned char ch1 = a; //ch1 == 0x78 char是一个字节,将int类型的数据存放在char类型上,存储的是低八位的数据
unsigned char ch2 = a >> 8; // ch2 == 0x56
总结:
& -- 置0 全1为1,有0则0
| -- 置1 全0为0,有1则1
^ -- 不同为1,相同为0
~ -- 打辅助 所有位0变1,1变0
<< -- 打辅助 所有位整体左移,低位补0,高位溢出舍弃
>> -- 数据分割 所有位整体右移,低位溢出舍弃,高位补符号位上的数据