成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java移位符淺析

blankyao / 3115人閱讀

摘要:左移運(yùn)算符首先我們將化為源碼因?yàn)槠涫穷愋停曰癁槎M(jìn)制有位正數(shù)的補(bǔ)碼和反碼等于源碼的本身。左移運(yùn)算符是將操作數(shù)的二進(jìn)制碼整理左移指定位數(shù),左移后右面空出的位用來補(bǔ)充。補(bǔ)充如果操作類型低于類型,比如,等,先將其轉(zhuǎn)化為類型在進(jìn)行移位。

java移位符初步使用與簡單理解 概述

java移位符主要包括3種:

運(yùn)算符 名稱
>> 左移運(yùn)算符
<< 有符號(hào)右移運(yùn)算符
<<< 無符號(hào)右移運(yùn)算符

這里我們先附上代碼運(yùn)行實(shí)例,原理將在后面以解析下面代碼的方式進(jìn)行講解:

public class BitOperatorTest {
    public static void main(String[] args){
        System.out.println(1 << 4);
        System.out.println(-1 << 3);
        System.out.println(8 >> 3);
        System.out.println(-8 >> 3);
        System.out.println(-8 >>> 3);
    }
}

結(jié)果如下:

16
-8
1
-1
536870911

????首先我們需要清楚在計(jì)算機(jī)系統(tǒng)中,數(shù)值一般用補(bǔ)碼來表示,主要原因是因?yàn)槭褂醚a(bǔ)碼可以使符號(hào)位和其他位統(tǒng)一處理,我們需要將上面的數(shù)值都轉(zhuǎn)化為補(bǔ)碼。

左移運(yùn)算符 1 << 4

????首先我們將1化為源碼:0000 0000 0000 0000 0000 0000 0000 0001 (因?yàn)槠涫莍nt類型,所以化為二進(jìn)制有32位)
????正數(shù)的補(bǔ)碼和反碼等于源碼的本身。所以補(bǔ)碼也為上述二進(jìn)制代碼。
左移運(yùn)算符是將操作數(shù)的二進(jìn)制碼整理左移指定位數(shù),左移后右面空出的位用0來補(bǔ)充。
左移4位 0000 0000 0000 0000 0000 0000 0000 0001 1*2^0=1
?????0000 0000 0000 0000 0000 0000 0000 0001 0000 (紅色被移除截?cái)?,藍(lán)色是新補(bǔ)的0) 1*2^4=16

-1 << 3

????我們開始第二個(gè)輸出語句,這是一個(gè)負(fù)數(shù)。負(fù)數(shù)的反碼是他的源碼符號(hào)位不變,其余按位取反。補(bǔ)碼是他的反碼加一。
所以我們可以得到-1的源碼為1000 0000 0000 0000 0000 0000 0000 0001 -1*2^0=-1
??????????反碼為1111 1111 1111 1111 1111 1111 1111 1110
??????????補(bǔ)碼為1111 1111 1111 1111 1111 1111 1111 1111
???對補(bǔ)碼進(jìn)行操作得111 1111 1111 1111 1111 1111 1111 1111 1000 (紅色被移除截?cái)?,藍(lán)色是新補(bǔ)的0)
?將結(jié)果數(shù)轉(zhuǎn)化為源碼得1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=-8

總結(jié)

?所以通過上面對左移運(yùn)算符的簡單使用不難發(fā)現(xiàn),我們可以將其簡便理解為移動(dòng)幾位,就是為操作數(shù)乘以2的幾次方。

右移運(yùn)算符

?左移運(yùn)算符不牽扯符號(hào)位的增補(bǔ)符號(hào)位,所以沒有有無符號(hào)分類

有符號(hào)右移運(yùn)算符 8 >> 3

?根據(jù)上面流程,我這里直接就簡化為
???源碼為:0000 0000 0000 0000 0000 0000 0000 1000 1*2^3=8
???反碼為:0000 0000 0000 0000 0000 0000 0000 1000
???補(bǔ)碼為:0000 0000 0000 0000 0000 0000 0000 1000
?運(yùn)算后結(jié)果:0000 0000 0000 0000 0000 0000 0000 0001 000 1*2^0=1(紅色被移除截?cái)?,藍(lán)色是新補(bǔ)的符號(hào)位,并且以原來的符號(hào)位填補(bǔ))

-8 >> 3

?根據(jù)上面流程,我這里直接就簡化為
???源碼為:1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=8
???反碼為:1111 1111 1111 1111 1111 1111 1111 0111
???補(bǔ)碼為:1111 1111 1111 1111 1111 1111 1111 1000
?運(yùn)算后結(jié)果:1111 1111 1111 1111 1111 1111 1111 1111 000 (紅色被移除截?cái)啵{(lán)色是新補(bǔ)的符號(hào)位,并且以原來的符號(hào)位填補(bǔ))
轉(zhuǎn)換為源碼為:1000 0000 0000 0000 0000 0000 0000 0001 -1*2^0=-1

總結(jié)

?同左移運(yùn)算符一樣,總結(jié)規(guī)律后可得出,右移運(yùn)算符移動(dòng)幾位則是對操作數(shù)除以2的多少次方。

無符號(hào)右移運(yùn)算符 -8 >>> 3

?根據(jù)上面流程,我這里直接就簡化為
???源碼為:1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=8
???反碼為:1111 1111 1111 1111 1111 1111 1111 0111
???補(bǔ)碼為:1111 1111 1111 1111 1111 1111 1111 1000
?運(yùn)算后結(jié)果:0001 1111 1111 1111 1111 1111 1111 1111 000 (紅色被移除截?cái)?,注意黃色部分,在無符號(hào)右移運(yùn)算位中統(tǒng)一補(bǔ)0)
?此時(shí)數(shù)值將會(huì)非常大,所以得到程序中的結(jié)果。

補(bǔ)充

?如果操作類型低于int類型,比如byte,char等,先將其轉(zhuǎn)化為int類型在進(jìn)行移位。
?對于int類型的移位,如果移動(dòng)位數(shù)超過32位,則讓位數(shù)對32取余,然后進(jìn)行運(yùn)行,即a>>33 == a>>1 a>>32 ==a
?同樣如果對于long類型的移位,移動(dòng)位數(shù)超過64,則也需要對移動(dòng)位數(shù)進(jìn)行處理。

代碼補(bǔ)充

對于補(bǔ)充內(nèi)容的代碼不進(jìn)行詳解,代碼及運(yùn)算結(jié)果如下,基本流程與上面類似,
代碼:

public class BitOperatorTest {
    public static void main(String[] args){
        System.out.println((char)4 << 4);
        System.out.println(4 << 4);
        System.out.println(4 << 36);
        System.out.println((long)1214 >> 66);
        System.out.println((long)1214 >> 2);
    }
}

?運(yùn)行結(jié)果:

64
64
64
303
303

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75528.html

相關(guān)文章

  • js中表達(dá)式 >>> 0 淺析

    摘要:向右被移出的位被丟棄,左側(cè)用填充。因?yàn)榉?hào)位變成了,所以結(jié)果總是非負(fù)的。即便右移個(gè)比特,結(jié)果也是非負(fù)的。這些與移位的位數(shù)無關(guān),移位位主要就是用了的內(nèi)部特性做了前兩種轉(zhuǎn)換。一個(gè)小小的表達(dá)式,隱藏著著多重的異常處理。 今天在看lodash的源碼中slice這個(gè)函數(shù)實(shí)現(xiàn)的時(shí)候發(fā)現(xiàn)了里面有這么一行代碼 length = start > end ? 0 : ((end - start) >>> ...

    Scliang 評論0 收藏0
  • 結(jié)合kmp算法的匹配動(dòng)畫淺析其基本思想

    摘要:寫在最前本次分享一下通過實(shí)現(xiàn)算法的動(dòng)畫效果來試圖展示的基本思路。算法的關(guān)鍵是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達(dá)到快速匹配的目的。本次主要通過動(dòng)畫演示的方式展現(xiàn)樸素算法與算法對比過程的異同從而試圖理解的基本思路。 寫在最前 本次分享一下通過實(shí)現(xiàn)kmp算法的動(dòng)畫效果來試圖展示kmp的基本思路。 歡迎關(guān)注我的博客,不定期更新中—— 前置概念 字符串匹配 字符串匹配是計(jì)算...

    wpw 評論0 收藏0
  • HashMap 淺析 —— LeetCode Two Sum 刷題總結(jié)

    摘要:注意這里我說的是一般情況下,因?yàn)楣K惴ㄐ枰骖櫺阅芘c準(zhǔn)確性,是有一定概率出現(xiàn)重復(fù)的情況的。哈希算法實(shí)際上是數(shù)學(xué)家和計(jì)算機(jī)基礎(chǔ)科學(xué)家研究的領(lǐng)域。 背景 做了幾年 CRUD 工程師,深感自己的計(jì)算機(jī)基礎(chǔ)薄弱,在看了幾篇大牛的分享文章之后,發(fā)現(xiàn)很多人都是通過刷 LeetCode 來提高自己的算法水平。的確,通過分析解決實(shí)際的問題,比自己潛心研究書本效率還是要高一些。 一直以來遇到底層自己無...

    zoomdong 評論0 收藏0
  • java程序入口main()方法淺析

    摘要:程序入口方法淺析方法的方法簽名方法簽名講解修飾符類由虛擬機(jī)調(diào)用,為了沒有限制可以自由的調(diào)用,所以采用修飾符。返回值主方法被調(diào)用,將返回值返回給沒有任何意義,因此該方法沒有返回值,所以使用。 java程序入口main()方法淺析 main()方法的方法簽名 public static void main(String[] args) 方法簽名講解 ?public修飾符:java類由jav...

    YFan 評論0 收藏0
  • 44個(gè)Java代碼性能優(yōu)化總結(jié)

    摘要:代碼優(yōu)化的最重要的作用應(yīng)該是避免未知的錯(cuò)誤。此舉能夠使性能平均提高。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對象,接口的構(gòu)造函數(shù)調(diào)用名為的本地同步方法,方法檢查堆棧,收集調(diào)用跟蹤信息。異常只能用于錯(cuò)誤處理,不應(yīng)該用來控制程序流程。 showImg(https://segmentfault.com/img/remote/1460000015379073); 代碼優(yōu)化的最重要的作用應(yīng)該是:避免未知的錯(cuò)誤...

    YanceyOfficial 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<