今天跟大家分享位運算的幾個使用小技巧,這些巧妙操作都是要在項目開發或者學習中不斷積累的,如果你在后續的編碼中用上的話,不僅能夠提高代碼效率,還能為你的代碼增色不少。
1、替代乘除2
這一點應該是基本操作了,我也在往期的文章中提到過多次。
特別是常用定點MCU的朋友,相信一點更是有自己的領悟,即使所使用的MCU帶有硬件浮點運算功能,采用整形定點運算也經常用來提高運算速度。
2、異或交換兩數
也就是我們面試題中常提到的,不用第三個變量交換兩個數:
3、判斷兩數是否同號
大部分朋友判斷兩個不為0的數是否同號都是采用兩數相乘是否>0來進行判斷,當然我也見過如下寫法的:
雖然兩種最終的結果,但總讓人覺得有點太初級、太累贅的感覺,所以代碼還是要寫得優雅,才讓人覺得你有點東西。
如果你稍加處理借用異或運算來進行判斷,會給人眼前一亮的感覺。
然而更重要的是相對乘法運算,其速度更快。
4、判斷奇偶數
判斷奇偶數無非就是識別該數是否能夠被2整除,通常我們采用如下表達式:
既然本文介紹位運算,又存在某種位運算會更加高效:
其無非就是利用了奇偶整形數的二進制最后一位是否為1來進行區分。
4、實現絕對值
實現絕對值還不簡單?abs用起來。
如果要不用條件語句實現絕對值功能,你會如何實現呢?
以8位整形數為例說明一下其實現,其他字長的整形類似處理:
這里也算是異或的應用吧,異或操作"相同為0,相異為1",假如a是一個有符號正數整數,a^0仍然為a,所以如上表達式對于整數仍然為原數。
而當a是一個有符號負值整形數,要實現abs功能,勢必要“對原數取反+1“,然而巧妙的是a^0xFF剛好是對a取反,-(a>>7)則剛好是+1。
屬實巧妙,不禁有點喜歡上了異或操作運算。
審核編輯:劉清
-
mcu
+關注
關注
146文章
17423瀏覽量
353652 -
位運算
+關注
關注
0文章
17瀏覽量
8465
發布評論請先 登錄
相關推薦
請問有沒有跟ADS5404匹配的運算放大器型號推薦呢?
技術干貨驛站 ▏解鎖C語言高效編程秘訣:深入解析運算符與優先級

TAS5825音量控制運算位寬是多少,是32bit嗎?
比較器與運算放大器件選型應用優勢介紹
51單片機(一款國產8位高性能Flash的接近感應單片機XD08M3232體驗感)
使用運算放大器應注意哪幾個問題
OPA300,OPA2300,OPA301,OPA2301 16位精度CMOS運算放大器數據表

verilog實現卷積運算
verilog語音實現浮點運算
運算放大器同向輸入端和反向輸入端怎么區分

C語言中的位域典型的實例

評論