? ? ? ?昨天在解答同學(xué)的問(wèn)題中,又接觸了好久沒(méi)碰的C中的位操作王浴。在重接觸的過(guò)程中脆炎,又理解了一遍計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的細(xì)節(jié),于是分享給大家看一下氓辣。
讓我們先看一下題目:編寫(xiě)一個(gè)程序秒裕,輸入兩個(gè)整數(shù)i、j钞啸,如果j的值大于0几蜻,則將i循環(huán)左移j位;
如果j的值小于0体斩,則將i循環(huán)右移j位梭稚,最后輸出i的值。
輸入輸出格式要求:
輸入格式:i j回車
i j 均用int類型存儲(chǔ)絮吵。
只輸出運(yùn)算結(jié)果弧烤,請(qǐng)不要輸出其他字符
例如:
輸入:3 10回車
輸出:3 3072
輸入:-65535 -2回車
輸出:2147467264
首先,我們要明確<<和>>移位操作是會(huì)溢出的蹬敲,比如01111100暇昂,左移三位后為11100000,它的1的個(gè)數(shù)是會(huì)減少的伴嗡。
而循環(huán)左移得到的應(yīng)為11100011急波。所以我們要解決的就是如何補(bǔ)回溢出的。
為了節(jié)約大家時(shí)間瘪校,先貼代碼澄暮,如果看懂 下面就不用細(xì)看了。
1.注意格式要求輸入int類型渣淤,但是有符號(hào)整數(shù)的右移補(bǔ)位赏寇,如果是負(fù)數(shù),根據(jù)編譯系統(tǒng)的不同既有可能是算術(shù)右移价认,也有可能是邏輯右移嗅定,即補(bǔ)償?shù)挠锌赡苁?,也有可能是1用踩。所以要化成無(wú)符號(hào)整數(shù)渠退,進(jìn)行運(yùn)算。
2.有可能輸入的j大于int的位數(shù)脐彩,這里即為32碎乃。所以要進(jìn)行越界檢查。
3.這里實(shí)現(xiàn)的關(guān)鍵是要對(duì)溢出的進(jìn)行補(bǔ)償惠奸,不妨這樣想象梅誓,<<操作即是把整數(shù)當(dāng)成隊(duì)列,左右兩邊補(bǔ)上無(wú)數(shù)個(gè)0,我們能看到的只有這32位.梗掰。而循環(huán)左移則是把整數(shù)當(dāng)成一個(gè)32位長(zhǎng)的環(huán)嵌言,于是解決方法自然應(yīng)運(yùn)而生。
那就是|上相反的位移操作32-j位及穗。因?yàn)槭且粋€(gè)環(huán)摧茴,所以左移n位就是右移(長(zhǎng)度-n)位。這樣溢出的就會(huì)有相應(yīng)補(bǔ)償埂陆。
4.最后要記得化為int類型苛白。