不使用abs通過位移來實現取乙個整數的絕對值

2021-06-27 12:28:09 字數 474 閱讀 9234

在32位機上若不用系統的函式及條件語句可以使用以下函式實現取絕對值:

int myabs(int n)

自己一開始沒有看懂,好久沒有搞原碼、反碼、和補碼的東西,趁著今天溫習一遍。

首先要知道補碼是在原碼基礎上變為反碼,之後再加一得到的,反之可以通過補碼得到原碼。

舉個例子:-4和4

如果傳入的是乙個正數4,補碼和原碼是一樣的都是:00....0100,在n>>31右移31位之後變成00....0000,再左移1位還是00....0000,之後的運算其實就是返回了(4*1)

如果傳入的是乙個負數4,補碼和原碼是不一樣的,原碼是:00....0100,補碼是:11....1100(負數的話右移在高位補的不是0而是1),在n>>31右移31位之後變成,11....1111,再左移1位還是11....1110(正數和負數的話左移在低位補的都是0),根據這個補碼變成原碼就是:10....0010,其實就是-2,之後的運算其實就是返回了(-4*-1)

通過位運算實現數值交換

對於數值的交換操作,通常會採用第三個變數作為中間變數過渡的交換方式。temp a a b b temp 使用這種方法,可以保證交換的準確性,但是由於會使用第三個變數,占用了額外的記憶體空間。那麼有沒有辦法不借助第三個變數實現兩個數值的交換呢?可以通過數值相加寄存和位運算兩種方式。1 相加寄存 可以將...

大數進製轉化 通過位移

僅突出運算,資料長度可根據需要擴充套件 在運算環境不支援long long時編寫 函 數 名 bcd2hex 功 能 六個位元組的壓縮bcd碼轉換成十六進製制 說 明 適用於linux以及微控制器,vs環境待測試 引數 bcd 6 待轉換資料 hexa 8 十六進製制 int bcd2hexa un...

php mysql通過位運算操作推薦位

position 字段設定為tinyint 假定 1代表首頁推薦 2代表欄目推薦 4代表內頁推薦 8代表其他推薦 那麼如果position 欄位的值為3就代表首頁推薦 欄目推薦 1 2 如果position 欄位的值為7代表首頁推薦 欄目推薦 內頁推薦 1 2 4 然後 position i pos...