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