作为一个开发人员,在看别人项目或者看第三方库的源代码时,可能经常会看到譬如a>>4&0x0f这样的写法,对于一些初入行的童鞋来说可能就不是太明白这是什么意思。下面我们就来讲解这几个运算符的实际用途。
一、运算符的含义 运算符含义描述右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。&按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。|按位或两个相应的二进制位中只要有一个为1,该位的结果值为1,否则为0。 二、用途 按位与的用途
1.清零
若想对一个存储单元清零,即使其全部二进制位为0,只要对这个存储单元当前的值取反(也就是原来的数中为1变为0,0变为1),然后使二者进行&运算,即可达到清零目的。 比如a=23,b=~a:
a:00010111
b:11101000
a&b:00000000
2.取一个数中某些指定位
比如a=23,我想取a的二进制的后面4位数,那么可以找一个后4位是1其余位是0的数b,即b=0x0f(十六进制,转换为二进制为00001111),a&b就得到了a的后四位。
a:00010111
b:00001111
a&b:00000111
3.保留指定位
比如a=23(用8bit表示),我想保留其二进制的第4和第6位(最左边为第1位),其余位置0。那么可以找一个第4和第6位是1其余位是0的数b与a进行按位与运算
a:00010111
b:00010100
a&b:00010100
按位或的用途
常用来对一个数的某些位置1,其余位不变。比如a=23,我想将其第2和第3位置为1,可以找一个第2、3位是1其余位是0的数与a进行按位或运算。
a:00010111
b:01100000
a|b:01110111
三、项目实例
在实际项目中,很多时候&和|都是和>>、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)。
最后将4个数拼起来就得到日期为2019年6月29日。