c語言負數左移右移 C語言中關於迴圈左移和迴圈右移

2021-10-13 13:35:56 字數 741 閱讀 7198

昨天在解答同學的問題中,又接觸了好久沒碰的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,所以說左移...