c語言中擷取整數和浮點數的符號位

來源:互聯網
上載者:User

標籤:c語言   符號位   

1. 為什麼要獲得符號位


很多時候,我們需要判斷數值的正負,來做相應的邏輯處理。條件判斷語句可以很好的完成這個需求。有時候會有下面的情況,

if (x > 0) {    x = x - 1;} else {    x = 1 - x;}if (x < 0) {   x = -x;}

正負只是數值的符號位變化,或是計算結果的符號位變化。但是我們需要用一個判斷,首先條件判斷會影響效率,其次格式不夠簡潔美觀。所以,有時候希望能不用條件判斷也解決問題。而數值的符號位已經被儲存在了數值的最高位,可以利用這點來避免條件判斷。



2.  如何得到符號位


可能有很多種方法。但是通過移位來獲得符號位是最直接想到的。移位有左移右移, 右移因為有符號位的問題。所以,有2個情況,有符號右移和無符號右移。有符號右移空位補符號位,無符號右移空位補0。當把有符號數,符號位移動到右邊第一位的時候,結果-1就是負數,0就是正數。當把無符號數,符號位移動到右邊第一位時候,結果1是負數,0正數。



3. 一種實現方法


因為浮點數無法移位,所以要麼強轉成正數處理,要麼就要拆成數組處理。這裡我們使用當做數組處理。

首先,我們把數值無論什麼類型當做char[]數組來處理,

(signed char*) &x

這樣數值就被分割都多個char類型的空間中,符號位就儲存在最高位的char空間中。

((signed char*) &x)[sizeof(x) - 1]

我們假定小端儲存模式,那麼符號位就在char數組的最後一個空間。我們拿到了有符號位的char資料並且當做有符號數來處理。

((signed char*) &x)[sizeof(x) - 1] >> 7


右移7位表示把符號移動到右邊第一位,那麼,正數就是0,負數就是-1

最後,完整的宏定義

/** * Get x sign bit only for little-endian * if x >= 0 then  1 * if x <  0 then -1 */#define MathUtils_SignBit(x) (((signed char*) &x)[sizeof(x) - 1] >> 7 | 1)

結果與1或,是把[0, -1]映射到[1, -1], 這樣我們就可以把最開始的例子寫成這樣:

x   = (x - 1) * MathUtils_SignBit(x)x *= MathUtils_SignBit(x)

c語言中擷取整數和浮點數的符號位

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.