今天跟大家分享位運(yùn)算的幾個(gè)使用小技巧,這些巧妙操作都是要在項(xiàng)目開發(fā)或者學(xué)習(xí)中不斷積累的,如果你在后續(xù)的編碼中用上的話,不僅能夠提高代碼效率,還能為你的代碼增色不少。
1、替代乘除2
這一點(diǎn)應(yīng)該是基本操作了,我也在往期的文章中提到過多次。

特別是常用定點(diǎn)MCU的朋友,相信一點(diǎn)更是有自己的領(lǐng)悟,即使所使用的MCU帶有硬件浮點(diǎn)運(yùn)算功能,采用整形定點(diǎn)運(yùn)算也經(jīng)常用來提高運(yùn)算速度。
2、異或交換兩數(shù)
也就是我們面試題中常提到的,不用第三個(gè)變量交換兩個(gè)數(shù):

3、判斷兩數(shù)是否同號(hào)
大部分朋友判斷兩個(gè)不為0的數(shù)是否同號(hào)都是采用兩數(shù)相乘是否>0來進(jìn)行判斷,當(dāng)然我也見過如下寫法的:

雖然兩種最終的結(jié)果,但總讓人覺得有點(diǎn)太初級(jí)、太累贅的感覺,所以代碼還是要寫得優(yōu)雅,才讓人覺得你有點(diǎn)東西。
如果你稍加處理借用異或運(yùn)算來進(jìn)行判斷,會(huì)給人眼前一亮的感覺。

然而更重要的是相對(duì)乘法運(yùn)算,其速度更快。
4、判斷奇偶數(shù)
判斷奇偶數(shù)無(wú)非就是識(shí)別該數(shù)是否能夠被2整除,通常我們采用如下表達(dá)式:

既然本文介紹位運(yùn)算,又存在某種位運(yùn)算會(huì)更加高效:

其無(wú)非就是利用了奇偶整形數(shù)的二進(jìn)制最后一位是否為1來進(jìn)行區(qū)分。
4、實(shí)現(xiàn)絕對(duì)值
實(shí)現(xiàn)絕對(duì)值還不簡(jiǎn)單?abs用起來。
如果要不用條件語(yǔ)句實(shí)現(xiàn)絕對(duì)值功能,你會(huì)如何實(shí)現(xiàn)呢?
以8位整形數(shù)為例說明一下其實(shí)現(xiàn),其他字長(zhǎng)的整形類似處理:

這里也算是異或的應(yīng)用吧,異或操作"相同為0,相異為1",假如a是一個(gè)有符號(hào)正數(shù)整數(shù),a^0仍然為a,所以如上表達(dá)式對(duì)于整數(shù)仍然為原數(shù)。
而當(dāng)a是一個(gè)有符號(hào)負(fù)值整形數(shù),要實(shí)現(xiàn)abs功能,勢(shì)必要“對(duì)原數(shù)取反+1“,然而巧妙的是a^0xFF剛好是對(duì)a取反,-(a>>7)則剛好是+1。
屬實(shí)巧妙,不禁有點(diǎn)喜歡上了異或操作運(yùn)算。
審核編輯:劉清
-
mcu
+關(guān)注
關(guān)注
147文章
18595瀏覽量
386134 -
位運(yùn)算
+關(guān)注
關(guān)注
0文章
17瀏覽量
8640
發(fā)布評(píng)論請(qǐng)先 登錄
單片機(jī)位數(shù)的思考(8位、16位、32位)
定點(diǎn)數(shù)表示實(shí)數(shù)的方法以及定點(diǎn)數(shù)在硬件上的運(yùn)算驗(yàn)證
卷積運(yùn)算分析
浮點(diǎn)數(shù)是如何實(shí)現(xiàn)開平方運(yùn)算的
基于8位Booth編碼的公式推導(dǎo)
浮點(diǎn)運(yùn)算單元的設(shè)計(jì)和優(yōu)化
risc-v中浮點(diǎn)運(yùn)算單元的使用及其設(shè)計(jì)考慮
優(yōu)化boot4的乘法運(yùn)算周期
跟大家一起來總結(jié)我半年內(nèi)參加三次鴻蒙比賽,失利了兩次的經(jīng)驗(yàn),這體驗(yàn)真刺激!??!
PKA外設(shè)RSA模冪運(yùn)算2048位計(jì)算結(jié)果和在線工具計(jì)算的不一樣是怎么回事?
運(yùn)算放大器速成課程第2部分:關(guān)鍵參數(shù)教程

跟大家分享位運(yùn)算的幾個(gè)使用小技巧
評(píng)論