C語言中<<、>>、&、|的實(shí)際用途

作為一個(gè)開發(fā)人員,在看別人項(xiàng)目或者看第三方庫的源代碼時(shí),可能經(jīng)常會(huì)看到譬如a>>4&0x0f這樣的寫法,對于一些初入行的童鞋來說可能就不是太明白這是什么意思。下面我們就來講解這幾個(gè)運(yùn)算符的實(shí)際用途。

一、運(yùn)算符的含義

運(yùn)算符 含義 描述
<< 左移 用來將一個(gè)數(shù)的各二進(jìn)制位全部左移N位,高位舍棄,低位補(bǔ)0。
>> 右移 將一個(gè)數(shù)的各二進(jìn)制位右移N位,移到右端的低位被舍棄,對于無符號數(shù),高位補(bǔ)0。
& 按位與 如果兩個(gè)相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1,否則為0。
l 按位或 兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為1,該位的結(jié)果值為1,否則為0。

二、用途

按位與的用途

1.清零

若想對一個(gè)存儲(chǔ)單元清零,即使其全部二進(jìn)制位為0,只要對這個(gè)存儲(chǔ)單元當(dāng)前的值取反(也就是原來的數(shù)中為1變?yōu)?,0變?yōu)?),然后使二者進(jìn)行&運(yùn)算,即可達(dá)到清零目的。
比如a=23,b=~a:

a:00010111
b:11101000
a&b:00000000

2.取一個(gè)數(shù)中某些指定位

比如a=23,我想取a的二進(jìn)制的后面4位數(shù),那么可以找一個(gè)后4位是1其余位是0的數(shù)b,即b=0x0f(十六進(jìn)制,轉(zhuǎn)換為二進(jìn)制為00001111),a&b就得到了a的后四位。

a:00010111
b:00001111
a&b:00000111

3.保留指定位

比如a=23(用8bit表示),我想保留其二進(jìn)制的第4和第6位(最左邊為第1位),其余位置0。那么可以找一個(gè)第4和第6位是1其余位是0的數(shù)b與a進(jìn)行按位與運(yùn)算

a:00010111
b:00010100
a&b:00010100

按位或的用途

常用來對一個(gè)數(shù)的某些位置1,其余位不變。比如a=23,我想將其第2和第3位置為1,可以找一個(gè)第2、3位是1其余位是0的數(shù)與a進(jìn)行按位或運(yùn)算。

a:00010111
b:01100000
a|b:01110111

三、項(xiàng)目實(shí)例

在實(shí)際項(xiàng)目中,很多時(shí)候&和|都是和>>、<<配合使用的。比如在藍(lán)牙項(xiàng)目開發(fā)中,2個(gè)設(shè)備之間進(jìn)行日期數(shù)據(jù)傳輸時(shí),我們先定一個(gè)協(xié)議,用4個(gè)byte來表示一個(gè)日期,其中byte0表示年份的高位數(shù),byte1表示年份的低位數(shù),byte2表示月份,byte3表示日期。
設(shè)備端現(xiàn)在收到另外一臺(tái)設(shè)備傳過來的日期數(shù)據(jù)00010100 00010011 00000110 00011101(為了閱讀方便我將每個(gè)byte之間用空格分開)。那么我要如何解析這個(gè)數(shù)據(jù)來得到實(shí)際日期呢?

/* 
*第一步,獲取日期。
*日期是最后一個(gè)byte,也就是最后8位,用一個(gè)后8位是1其余位是0的數(shù)(11111111,十六進(jìn)制表示是0xff)與數(shù)據(jù)進(jìn)行按位與計(jì)算即可
*/
date = 00010100 00010011 00000110 00011101;
day = date & 0xff;(計(jì)算結(jié)果是00011101,十進(jìn)制表示是29,也就是日期是29)。

/* 
*第二步,獲取月份。
*月份是倒數(shù)第2個(gè)byte,此時(shí)需要先將最后一個(gè)byte砍掉(也就是右移8位),然后再和0xff進(jìn)行按位與運(yùn)算
*下面代碼可以簡寫成date=date>>8&0xff;
*/
date = date>>8; (計(jì)算結(jié)果是00010100 00010011 00000110)
month = date & 0xff;(計(jì)算結(jié)果是00000110,十進(jìn)制表示是6,也就是月份是6月)。

/* 
*第三步,獲取年份低位。
*先將最后一個(gè)byte砍掉(也就是右移8位),然后再和0xff進(jìn)行按位與運(yùn)算
*下面代碼可以簡寫成date=date>>8&0xff;
*/
date = date>>8; (計(jì)算結(jié)果是00010100 00010011)
year_low = date & 0xff;(計(jì)算結(jié)果是00010011,十進(jìn)制表示是19)。

/* 
*第四步,獲取年份高位。
*先將最后一個(gè)byte砍掉(也就是右移8位),然后再和0xff進(jìn)行按位與運(yùn)算
*下面代碼可以簡寫成date=date>>8&0xff;
*/
date = date>>8; (計(jì)算結(jié)果是00010100)
year_heigh = date & 0xff;(計(jì)算結(jié)果是00010011,十進(jìn)制表示是20)。

最后將4個(gè)數(shù)拼起來就得到日期為2019年6月29日。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容