昨天在解答同學的問題中,又接觸了好久沒碰的c中的位操作。在重接觸的過程中,又理解了一遍計算機儲存資料的細節,於是分享給大家看一下。
讓我們先看一下題目:編寫乙個程式,輸入兩個整數i、j,如果j的值大於0,則將i迴圈左移j位;
如果j的值小於0,則將i迴圈右移j位,最後輸出i的值。
輸入輸出格式要求:
輸入格式:i j回車
i j 均用int型別儲存。
只輸出運算結果,請不要輸出其他字元
例如:輸入:3 10回車
輸出:3 3072
輸入:-65535 -2回車
輸出:2147467264
首先,我們要明確<>移位操作是會溢位的,比如01111100,左移三位後為11100000,它的1的個數是會減少的。
而迴圈左移得到的應為11100011。所以我們要解決的就是如何補回溢位的。
為了節約大家時間,先貼**,如果看懂 下面就不用細看了。
1.注意格式要求輸入int型別,但是有符號整數的右移補位,如果是負數,根據編譯系統的不同既有可能是算術右移,也有可能是邏輯右移,即補償的有可能是0,也有可能是1。所以要化成無符號整數,進行運算。
2.有可能輸入的j大於int的位數,這裡即為32。所以要進行越界檢查。
3.這裡實現的關鍵是要對溢位的進行補償,不妨這樣想象,<
那就是|上相反的位移操作32-j位。因為是乙個環,所以左移n位就是右移(長度-n)位。這樣溢位的就會有相應補償。
4.最後要記得化為int型別。
c語言負數左移右移 C語言中的左移與右移
先說左移,左移就是把乙個數的所有位都向左移動若干位,在c中用 i i 2 把i裡的值左移2位也就是說,1的2進製是000.0001 這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0 左移2位之後變成000.0100,也就是10進製的4,所以說左移1位相當於乘以2,那麼左移n位就是...
c語言負數左移右移 C語言負數的移位運算
在c 中左移也就是所說的邏輯移位,右端補,而右移是算數移位,左端補齊的是最高位 的符號位。故負數左移,有可能變成正數,但負數右移,肯定還是負數。用進製的形式對資料進行賦值 這進製的數代表的是補碼。i 0xfffffff7 0xfffffff7 是補碼,而不是原碼,故 i 9 printf d x n...
c語言中的左移和右移
先說左移,左移就是把乙個數的所有位都向左移動若干位,在c中用 運算子.例如 int i 1 i i 2 把i裡的值左移2位 也就是說,1的2進製是000.0001 這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0 左移2位之後變成 000.0100,也就是10進製的4,所以說左移...