C語言位操作 判斷整數的符號

2022-02-08 05:35:17 字數 1437 閱讀 4208

關於衡量計算操作的方法:

當為演算法統計操作的數量的時候,所有的c運算子被認為是一樣的操作。中間過程不被寫入隨機儲存器(ram)而不被計算,當然,這種運算元的計算方法,只是作為那些接近機器指令和cpu執行時間的服務。所有的操作被假設成花相同的執行時間,事實上是不正確的。有很多不同的因素決定乙個系統能多快執行一段樣例**,例如:快取大小,記憶體頻寬,指令集合等等……。最後,建立一套標準才是衡量一種方法快過另一種方法的最好方法。

判斷乙個整數的符號:

int v;      // v為我們要判斷的整數

int sign; // 儲存結果

sign = -(v < 0); // if v < 0 sign= -1, else 0.

//或者為了避免在cpu上判斷而使用暫存器

sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * char_bit - 1)); // char_bit 是每位元組的位數 (通常為 8).

//或者為了減少指令(但不輕便)

sign = v >> (sizeof(int) * char_bit - 1);

測試**:

#include#include#include#include#includeint test(int v)

int main()

評估一下上面最後乙個語句:sign = v >> 31

for 32-bit integers,這是乙個比常規操作:sign

= -(v < 0).

更快的方法,這種技巧可行是因為:當有符號整數右移,最左邊的位被複製到其他位,最左邊的位是1說明這個整數是負數,否則為0則為正數。當所有的位是1的時候返回-1,但是這種行為是面向特定的結構。

又或者你更加喜歡返回的結果為-1或+1,於是有了下面的表達方式:

ign = +1 | (v >> (sizeof(int) * char_bit - 1));  // 假如v < 0 返回-1, 否則返回 +1
再或者你偏愛結果返回形式是-1,0,+1,可以使用下列表現形式:

sign = (v != 0) | -(int)((unsigned int)((int)v) >> (sizeof(int) * char_bit - 1));

//或者速度更快,但是不輕便

sign = (v != 0) | (v >> (sizeof(int) * char_bit - 1)); // -1, 0, or +1

// 或者輕便、簡潔但是也許速度不快

sign = (v > 0) - (v < 0); // -1, 0, or +1

可能你想知道數字是否非負,結果返回值為:+1或者0,於是可以使用sign = 1 ^ ((unsigned int)v >> (sizeof(int) * char_bit - 1)); // 如果 v < 0  返回 0, 否則返回 1

位操作筆記 判斷兩個整數的符號位是否相反

判斷兩個整數的符號位是否相反,也就是兩個數是否乙個是正數,乙個是負數。該演算法通過異或的結果大小來判斷兩個整數的符號位是否相反。bool detect opposite signs int x,int y 第一步,x y,兩個整數先進行異或。第二步,判斷異或的結果是否小於0,如果兩個整數的符號位相反...

32 位的有符號整數 如何在C和C 中操作位

計算機中的所有資料均以二進位制表示,即0或1。計算機不理解我們的語言,它們理解位。通常,程式設計師並不關心位級別的操作。但是有時程式設計師必須更深入地研究並研究位元。位表示 在程式設計中,將n位整數儲存 為由n位組成的二進位制數。因此,乙個32位整數由32位組成,而64位 整數由64位組成。在c 程...

C語言中獲取整數和浮點數的符號位

1.為什麼要獲得符號位 很多時候,我們需要判斷數值的正負,來做相應的邏輯處理。條件判斷語句可以很好的完成這個需求。有時候會有下面的情況,if x 0 else if x 0 正負只是數值的符號位變化,或是計算結果的符號位變化。但是我們需要用乙個判斷,首先條件判斷會影響效率,其次格式不夠簡潔美觀。所以...