# 常见运算符
# 含义
运算符 | 名称 | 作用 |
---|---|---|
<< | 左移 | 用来将一个数的各二进制位全部左移N位,高位舍弃,低位补0。 |
>> | 右移 | 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。 |
& | 按位与 | 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。 |
l | 按位或 | 两个相应的二进制位中只要有一个为1,该位的结果值为1,否则为0。 |
# 常见作用
- &常用来:清零
若想对一个存储单元清零,即使其全部二进制位为0,只要对这个存储单元当前的值取反(也就是原来的数中为1变为0,0变为1),然后使二者进行&运算,即可达到清零目的。
a:00010111
b:11101000
a&b:00000000
1
2
3
2
3
- &常用来:取一个数中某些指定位
比如a=23,我想取a的二进制的后面4位数,那么可以找一个后4位是1其余位是0的数b,即b=0x0f(十六进制,转换为二进制为00001111),a&b就得到了a的后四位。
a:00010111
b:00001111
a&b:00000111
1
2
3
2
3
- &常用来:保留指定位
比如a=23(用8bit表示),我想保留其二进制的第4和第6位(最左边为第1位),其余位置0。那么可以找一个第4和第6位是1其余位是0的数b与a进行按位与运算
a:00010111
b:00010100
a&b:00010100
1
2
3
2
3
- 按位或
常用来对一个数的某些位置变为1,其余位不变。比如a=23,我想将其第2和第3位置为1,可以找一个第2、3位是1其余位是0的数与a进行按位或运算。
a:00010111
b:01100000
a|b:01110111
1
2
3
2
3
# 举例
先定一个协议,用4个byte来表示一个日期,其中byte0表示年份的高位数,byte1表示年份的低位数,byte2表示月份,byte3表示日期,下面展示如何将数据00010100 00010011 00000110 00011101
还原成时间。
/*
*第一步,获取日期。
*日期是最后一个byte,也就是最后8位,
用一个后8位是1其余位是0的数(11111111,十六进制表示是0xff)
与数据进行按位与计算即可
*/
date = 00010100 00010011 00000110 00011101;
day = date & 0xff;(计算结果是00011101,十进制表示是29,也就是日期是29)。
/*
*第二步,获取月份。
*月份是倒数第2个byte,此时需要先将最后一个byte砍掉(也就是右移8位),
然后再和0xff进行按位与运算
*下面代码可以简写成date=date>>8&0xff;
*/
date = date>>8; (计算结果是00010100 00010011 00000110)
month = date & 0xff;(计算结果是00000110,十进制表示是6,也就是月份是6月)。
/*
*第三步,获取年份低位。
*先将最后一个byte砍掉(也就是右移8位),然后再和0xff进行按位与运算
*下面代码可以简写成date=date>>8&0xff;
*/
date = date>>8; (计算结果是00010100 00010011)
year_low = date & 0xff;(计算结果是00010011,十进制表示是19)。
/*
*第四步,获取年份高位。
*先将最后一个byte砍掉(也就是右移8位),然后再和0xff进行按位与运算
*下面代码可以简写成date=date>>8&0xff;
*/
date = date>>8; (计算结果是00010100)
year_heigh = date & 0xff;(计算结果是00010011,十进制表示是20)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34