c語言位操作
2023年06月04日 16:51:00
閱讀數:1553
此文將花費您8~15分鐘時間,帶您對嵌入式中常用的位操作有個了解。和數位電路有點相似!感謝閱讀!
位操作符
1.位與&
1、注意:位與符號是乙個&,兩個&&是邏輯與。
2、真值表:1&0=01&1=10&0=00&1=0
3、從真值表可以看出:位與操作的特點是,只有1和1位與結果為1,其餘全是0.
4、位與和邏輯與的區別:位與時兩個運算元是按照二進位制位彼次對應位相與的,邏輯與是兩個運算元作為整體來相與的。(舉例:0xaa&0xf0=0xa0,0xaa && 0xf0=1)
2.位或|
1、注意:位或符號是乙個|,兩個||是邏輯或。
2、真值表:1|0=11|1=10|0=00|1=1
3、從真值表可以看出:位或操作的特點是:只有2個0相位或才能得到0,只要有1個1結果就一定是1.
4、位或和邏輯或的區別:位或時兩個運算元是按照二進位制位彼次對應位相與的,邏輯或是兩個運算元作為整體來相或的。
3.位取反~
1、注意:c語言中位取反是~,c語言中的邏輯取反是!
2、按位取反是將運算元的二進位制位逐個按位取反(1變成0,0變成1);而邏輯取反是真(在c語言中只要不是0的任何數都是真)變成假(在c語言中只有0表示假)、假變成真。
實驗:2.擷取變數的部分連續位。例如:變數0x88, 也就是0b10001000,若擷取第2~4位,則值為:0b100 = 4
分析:這個題目相當於我們位運算實戰演練1中5.做的事情,只不過要用巨集來實現。
這個題目相當於是要把x的bit(n-1)到bit(m-1)取出來
注:優先順序~ 高於 《高於&
u表示unsigned int-32
複雜巨集怎麼分析:
((x & ~(~(0u)<<(m-n+1))<<(n-1)) >> (n-1))
第一步,先分清楚這個複雜巨集分為幾部分:2部分
@(x & ~(~(0u)<<(m-n+1))<<(n-1))
@>>(n-1)
分析為什麼要》(n-1),相當於是我們5.中的第二步(第二步,再將其右移3位得到結果。)
第二步,繼續解析剩下的:又分為2部分
@x&
@~(~(0u)<<(m-n+1))<<(n-1)
分析為什麼要&,相當於我們5中的第一步 (第一步:先將這個數bit3~bit8不變,其餘位全部清零。)
第三步,繼續分析剩下的:
~ (~(0u)<<(m-n+1))<<(n-1)
這個分析時要搞清楚第2坨到底應該先左邊取反再右邊<<;還是先右邊《再左邊取反。
解法:第一,查c語言優先順序表;第二,自己實際寫個**測試。
說明這個式子應該是 ~(~(0u)<<(m-n+1))<<(n-1) ,這就又分為2部分了
0x88:10001000
例如:變數0x88, 也就是0b10001000,若擷取第2~4位,則值為:0b100 = 4
~(~(0u)<<(m-n+1))<<(n-1)):00001110
(x & ~(~(0u)<<(m-n+1))<<(n-1)):00001000
(x & ~(~(0u)<<(m-n+1))<<(n-1)) >> (n-1):00001000
C 位操作技巧
一 注意事項 a 與 兩位都為1,才為1 b 或 兩位都為0,才為0 c 微操作只能用於整形資料,float和double進行位操作時編譯器會報錯 d 異或 兩位相同為0,不同為1 e 取反 1變為0,0變為1 f 左移 各二進位制全部向左移位,高位丟失,低位補零 g 右移 各二進位制全部向右移位,...
C 位操作技巧
一 注意事項 a 與 兩位都為1,才為1 b 或 兩位都為0,才為0 c 微操作只能用於整形資料,float和double進行位操作時編譯器會報錯 d 異或 兩位相同為0,不同為1 e 取反 1變為0,0變為1 f 左移 g 右移 各二進位制全部向右移位,對於無符號數,低位丟失,高位補零 有符號數個...
C語言位操作
在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來 完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功 能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種位運算...