C語言幾道位移運算題

來源:互聯網
上載者:User

1 << -1

1 << -1是多少?

字面上看1左移-1位,似乎是1右移1位的意思。

但實際結果卻是-2147483648,而-2147483648 = - 2 31。

也就是說實際上1 << -1等同 於:

1 << 31

為什嗎?╮(╯_╰)╭沒有什麼為什麼,就是這樣定義的,可以說為了配合 Javascript中整型是32位的吧。

也就是說m << -n等同於:

m << (-n % 32 + 32)

在c語言中,這樣寫編譯的時候會拋錯的。

但是,Java中的這個式子的結果和Javascript中 相同。準確的說是在運算數字為32位整形的時候。比如如果我們將數字改成長整形,其結果有不同了。

public class test{    public static void main(String[] args){        System.out.println(1L << -1);    // -9223372036854775808    }        }

那麼1 >> -1呢?

左移負數位,似乎是固定為0的。

無論哪個數來移,移多少 位都一樣。

alert(1 >> -1)    // 0

(1 << 31)為什麼是負數

首先位移運算是基於補碼的,所以先複習一下補碼的知識。

正整數的補碼就是其本身。

負整數 的補碼是,其符號位不變,數值部分的各位取反,然後整個數加1。

(32位整數-2147483648有些特別 ,其二進位表示是-10000000000000000000000000000000,而且補碼是10000000000000000000000000000000)

所以1的補碼是00000000000000000000000000000001,左移31位就變成了 10000000000000000000000000000000,即-2147483648。

(1 << 31) - 1是多少?

因為1 << 31是32位整形最小能表示的數字,在Java中這個式子的結果是2147483647,也就是說溢出然後變成 所能表示的最大整數了。

但Javascript不太相同,這個式子的結果是-2147483649,因為Javascript引 擎自動將其變成64位浮點數來表示了。

一道筆試題

-13 >> 2是多少?

講了這麼 多,這道題就很簡單了。

因為-1310是-11012,則補碼是1111....0011,則右移2位則為1111...1100。 所以最後結果是-1002,即結果是-410。

我們也可以記住,右移1位操作是除以2再向下取整。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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