敘述:
嵌入式位運(yùn)算是嵌入式系統(tǒng)中常用的優(yōu)化技巧之一,它可以通過位運(yùn)算操作來實(shí)現(xiàn)一些常見的數(shù)學(xué)運(yùn)算、邏輯運(yùn)算等,從而提高程序的執(zhí)行效率。
本文就這方面進(jìn)行介紹。
我個(gè)人認(rèn)為,位操作就是取、刪、反、移位、清空、切換等這些,但是在實(shí)際中因?yàn)閷?duì)這方面的理解不夠透徹,導(dǎo)致在寫代碼時(shí),不知道怎么操作。
位移運(yùn)算
位移運(yùn)算包括左移運(yùn)算和右移運(yùn)算,通過將二進(jìn)制數(shù)的位向左或向右移動(dòng)指定的位數(shù),可以實(shí)現(xiàn)快速的乘以或除以2的冪次方操作。 例如,將一個(gè)整數(shù)向左移動(dòng)3位,相當(dāng)于將其乘以2的3次方(即8),將一個(gè)整數(shù)向右移動(dòng)2位,相當(dāng)于將其除以2的2次方(即4)。
1int x = 10; // 聲明一個(gè)整數(shù)變量 x,初始值為 10
2int y = x << 3; // 將 x 左移 3 位,相當(dāng)于乘以 8
3int z = x >> 2; // 將 x 右移 2 位,相當(dāng)于除以 4
位與運(yùn)算
位與運(yùn)算是對(duì)兩個(gè)數(shù)的每個(gè)二進(jìn)制位進(jìn)行邏輯與操作,如果兩個(gè)相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果為1,否則為0。 位與運(yùn)算常用于掩碼操作、判斷奇偶性等。
1int x = 0x0F; // 聲明一個(gè)整數(shù)變量 x,初始值為 0x0F(二進(jìn)制為 0000 1111)
2int y = 0x03; // 聲明一個(gè)整數(shù)變量 y,初始值為 0x03(二進(jìn)制為 0000 0011)
3int z = x & y; // 對(duì) x 和 y 進(jìn)行位與運(yùn)算,結(jié)果為 0000 0011(十進(jìn)制為 3)
位或運(yùn)算
位或運(yùn)算是對(duì)兩個(gè)數(shù)的每個(gè)二進(jìn)制位進(jìn)行邏輯或操作,如果兩個(gè)相應(yīng)的二進(jìn)制位中至少有一個(gè)為1,則該位的結(jié)果為1,否則為0。 位或運(yùn)算常用于設(shè)置標(biāo)志位、合并掩碼等。
1int x = 0x0F; // 聲明一個(gè)整數(shù)變量 x,初始值為 0x0F(二進(jìn)制為 0000 1111)
2int y = 0x03; // 聲明一個(gè)整數(shù)變量 y,初始值為 0x03(二進(jìn)制為 0000 0011)
3int z = x | y; // 對(duì) x 和 y 進(jìn)行位或運(yùn)算,結(jié)果為 0000 1111(十進(jìn)制為 15)
位異或運(yùn)算
位異或運(yùn)算是對(duì)兩個(gè)數(shù)的每個(gè)二進(jìn)制位進(jìn)行邏輯異或操作,如果兩個(gè)相應(yīng)的二進(jìn)制位不相同,則該位的結(jié)果為1,否則為0。 位異或運(yùn)算常用于取反標(biāo)志位、差分?jǐn)?shù)據(jù)傳輸?shù)取?/p>
1int x = 0x0F; // 聲明一個(gè)整數(shù)變量 x,初始值為 0x0F(二進(jìn)制為 0000 1111)
2int y = 0x03; // 聲明一個(gè)整數(shù)變量 y,初始值為 0x03(二進(jìn)制為 0000 0011)
3int z = x ^ y; // 對(duì) x 和 y 進(jìn)行位異或運(yùn)算,結(jié)果為 0000 1100(十進(jìn)制為 12)
位取反運(yùn)算
位取反運(yùn)算是對(duì)一個(gè)數(shù)的每個(gè)二進(jìn)制位進(jìn)行邏輯取反操作,即將1變?yōu)?,0變?yōu)?。 位取反運(yùn)算常用于反轉(zhuǎn)標(biāo)志位、取反掩碼等。
1int x = 0x0F; // 聲明一個(gè)整數(shù)變量 x,初始值為 0x0F(二進(jìn)制為 0000 1111)
2int y = ~x; // 對(duì) x 進(jìn)行位取反運(yùn)算,結(jié)果為 1111 0000(十進(jìn)制為 -16)
位域操作
位域是一種將一個(gè)或多個(gè)字段打包到一個(gè)單一的機(jī)器字中的數(shù)據(jù)結(jié)構(gòu)。 位域可以有效地壓縮存儲(chǔ)空間,并且可以提高程序的執(zhí)行效率。 位域常用于控制寄存器、狀態(tài)寄存器等。
1struct {
2 unsigned char a : 4; // 定義一個(gè) 4 位的無符號(hào)整數(shù)字段 a
3 unsigned char b : 3; // 定義一個(gè) 3 位的無符號(hào)整數(shù)字段 b
4 unsigned char c : 1; // 定義一個(gè) 1 位的無符號(hào)整數(shù)字段 c
5} bitfield;
6
7bitfield.a = 5; // 設(shè)置字段 a 的值為 5(二進(jìn)制為 0101)
8bitfield.b = 2; // 設(shè)置字段 b 的值為 2(二進(jìn)制為 010)
9bitfield.c = 1; // 設(shè)置字段 c 的值為 1(二進(jìn)制為 1)
清除位:
可以使用位運(yùn)算符將特定的位設(shè)置為0。 例如,如果需要清除一個(gè)8位字節(jié)的最高位,可以使用以下代碼:
1unsigned char byte = 0xFF;
2byte &= 0x7F; // Clear the highest bit
設(shè)置位:
可以使用位運(yùn)算符將特定的位設(shè)置為1。 例如,如果需要將一個(gè)8位字節(jié)的第4位設(shè)置為1,可以使用以下代碼:
1unsigned char byte = 0x00;
2byte |= 0x10; // Set the 4th bit
反轉(zhuǎn)位:
可以使用位運(yùn)算符將特定的位取反。 例如,如果需要反轉(zhuǎn)一個(gè)8位字節(jié)的所有位,可以使用以下代碼:
1unsigned char byte = 0x55;
2byte ^= 0xFF; // Invert all bits
檢查位:
可以使用位運(yùn)算符檢查特定的位是否設(shè)置為1或0。 例如,如果需要檢查一個(gè)8位字節(jié)的第2位是否為1,可以使用以下代碼:
1unsigned char byte = 0x04;
2if (byte & 0x02) {
3 // The 2nd bit is set
4} else {
5 // The 2nd bit is not set
6}
-
嵌入式
+關(guān)注
關(guān)注
5088文章
19159瀏覽量
306509 -
寄存器
+關(guān)注
關(guān)注
31文章
5359瀏覽量
120818 -
二進(jìn)制
+關(guān)注
關(guān)注
2文章
795瀏覽量
41705 -
代碼
+關(guān)注
關(guān)注
30文章
4810瀏覽量
68827 -
位運(yùn)算
+關(guān)注
關(guān)注
0文章
17瀏覽量
8444
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論