1 << -1
1 << -1是多少?
字面上看1左移-1位,似乎是1右移1位的意思。
但實(shí)際結(jié)果卻是-2147483648,而-2147483648 = - 2 31 。
也就是說(shuō)實(shí)際上1 << -1等同于:
1 << 31
為什么?╮(╯_╰)╭沒(méi)有什么為什么,就是這樣定義的,可以說(shuō)為了配合Javascript中整型是32位的吧。
也就是說(shuō)m << -n等同于:
m << (-n % 32 + 32)
在c語(yǔ)言中,這樣寫(xiě)編譯的時(shí)候會(huì)拋錯(cuò)的。
但是,Java中的這個(gè)式子的結(jié)果和Javascript中相同。準(zhǔn)確的說(shuō)是在運(yùn)算數(shù)字為32位整形的時(shí)候。比如如果我們將數(shù)字改成長(zhǎng)整形,其結(jié)果有不同了。
public class test{ public static void main(String[] args){ System.out.println( 1L << -1); // -9223372036854775808 } }
?
那么1 >> -1呢?
左移負(fù)數(shù)位,似乎是固定為0的。
無(wú)論哪個(gè)數(shù)來(lái)移,移多少位都一樣。
alert(1 >> -1) // 0
?
(1 << 31)為什么是負(fù)數(shù)
首先位移運(yùn)算是基于補(bǔ)碼的,所以先復(fù)習(xí)一下補(bǔ)碼的知識(shí)。
正整數(shù)的補(bǔ)碼就是其本身。
負(fù)整數(shù)的補(bǔ)碼是, 其符號(hào)位不變,數(shù)值部分的各位取反,然后整個(gè)數(shù)加1。
(32位整數(shù)-2147483648有些特別,其二進(jìn)制表示是-10000000000000000000000000000000,而且補(bǔ)碼是 10000000000000000000000000000000 )
所以1的補(bǔ)碼是 00000000000000000000000000000001,左移31位就變成了 10000000000000000000000000000000,即 -2147483648。
?
(1 << 31) - 1是多少?
因?yàn)? << 31是32位整形最小能表示的數(shù)字,在Java中這個(gè)式子的結(jié)果是2147483647,也就是說(shuō)溢出然后變成所能表示的最大整數(shù)了。
但Javascript不太相同,這個(gè)式子的結(jié)果是-2147483649,因?yàn)镴avascript引擎自動(dòng)將其變成64位浮點(diǎn)數(shù)來(lái)表示了。
?
一道筆試題
-13 >> 2是多少?
講了這么多,這道題就很簡(jiǎn)單了。
因?yàn)?13 10 是-1101 2 ,則補(bǔ)碼是1111....0011,則右移2位則為1111...1100。所以最后結(jié)果是-100 2 ,即結(jié)果是-4 10 。
我們也可以記住,右移1位操作是除以2再向下取整。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
