摘要:左移運算符首先我們將化為源碼因為其是類型,所以化為二進制有位正數(shù)的補碼和反碼等于源碼的本身。左移運算符是將操作數(shù)的二進制碼整理左移指定位數(shù),左移后右面空出的位用來補充。補充如果操作類型低于類型,比如,等,先將其轉(zhuǎn)化為類型在進行移位。
java移位符初步使用與簡單理解 概述
java移位符主要包括3種:
運算符 | 名稱 |
---|---|
>> | 左移運算符 |
<< | 有符號右移運算符 |
<<< | 無符號右移運算符 |
這里我們先附上代碼運行實例,原理將在后面以解析下面代碼的方式進行講解:
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
????首先我們需要清楚在計算機系統(tǒng)中,數(shù)值一般用補碼來表示,主要原因是因為使用補碼可以使符號位和其他位統(tǒng)一處理,我們需要將上面的數(shù)值都轉(zhuǎn)化為補碼。
左移運算符 1 << 4????首先我們將1化為源碼:0000 0000 0000 0000 0000 0000 0000 0001 (因為其是int類型,所以化為二進制有32位)
????正數(shù)的補碼和反碼等于源碼的本身。所以補碼也為上述二進制代碼。
左移運算符是將操作數(shù)的二進制碼整理左移指定位數(shù),左移后右面空出的位用0來補充。
左移4位 0000 0000 0000 0000 0000 0000 0000 0001 1*2^0=1
?????0000 0000 0000 0000 0000 0000 0000 0001 0000 (紅色被移除截斷,藍色是新補的0) 1*2^4=16
????我們開始第二個輸出語句,這是一個負(fù)數(shù)。負(fù)數(shù)的反碼是他的源碼符號位不變,其余按位取反。補碼是他的反碼加一。
所以我們可以得到-1的源碼為1000 0000 0000 0000 0000 0000 0000 0001 -1*2^0=-1
??????????反碼為1111 1111 1111 1111 1111 1111 1111 1110
??????????補碼為1111 1111 1111 1111 1111 1111 1111 1111
???對補碼進行操作得111 1111 1111 1111 1111 1111 1111 1111 1000 (紅色被移除截斷,藍色是新補的0)
?將結(jié)果數(shù)轉(zhuǎn)化為源碼得1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=-8
?所以通過上面對左移運算符的簡單使用不難發(fā)現(xiàn),我們可以將其簡便理解為移動幾位,就是為操作數(shù)乘以2的幾次方。
右移運算符?左移運算符不牽扯符號位的增補符號位,所以沒有有無符號分類
有符號右移運算符 8 >> 3?根據(jù)上面流程,我這里直接就簡化為
???源碼為:0000 0000 0000 0000 0000 0000 0000 1000 1*2^3=8
???反碼為:0000 0000 0000 0000 0000 0000 0000 1000
???補碼為:0000 0000 0000 0000 0000 0000 0000 1000
?運算后結(jié)果:0000 0000 0000 0000 0000 0000 0000 0001 000 1*2^0=1(紅色被移除截斷,藍色是新補的符號位,并且以原來的符號位填補)
?根據(jù)上面流程,我這里直接就簡化為
???源碼為:1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=8
???反碼為:1111 1111 1111 1111 1111 1111 1111 0111
???補碼為:1111 1111 1111 1111 1111 1111 1111 1000
?運算后結(jié)果:1111 1111 1111 1111 1111 1111 1111 1111 000 (紅色被移除截斷,藍色是新補的符號位,并且以原來的符號位填補)
轉(zhuǎn)換為源碼為:1000 0000 0000 0000 0000 0000 0000 0001 -1*2^0=-1
?同左移運算符一樣,總結(jié)規(guī)律后可得出,右移運算符移動幾位則是對操作數(shù)除以2的多少次方。
無符號右移運算符 -8 >>> 3?根據(jù)上面流程,我這里直接就簡化為
???源碼為:1000 0000 0000 0000 0000 0000 0000 1000 -1*2^3=8
???反碼為:1111 1111 1111 1111 1111 1111 1111 0111
???補碼為:1111 1111 1111 1111 1111 1111 1111 1000
?運算后結(jié)果:0001 1111 1111 1111 1111 1111 1111 1111 000 (紅色被移除截斷,注意黃色部分,在無符號右移運算位中統(tǒng)一補0)
?此時數(shù)值將會非常大,所以得到程序中的結(jié)果。
?如果操作類型低于int類型,比如byte,char等,先將其轉(zhuǎn)化為int類型在進行移位。
?對于int類型的移位,如果移動位數(shù)超過32位,則讓位數(shù)對32取余,然后進行運行,即a>>33 == a>>1 a>>32 ==a
?同樣如果對于long類型的移位,移動位數(shù)超過64,則也需要對移動位數(shù)進行處理。
對于補充內(nèi)容的代碼不進行詳解,代碼及運算結(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); } }
?運行結(jié)果:
64 64 64 303 303
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/75528.html
摘要:向右被移出的位被丟棄,左側(cè)用填充。因為符號位變成了,所以結(jié)果總是非負(fù)的。即便右移個比特,結(jié)果也是非負(fù)的。這些與移位的位數(shù)無關(guān),移位位主要就是用了的內(nèi)部特性做了前兩種轉(zhuǎn)換。一個小小的表達式,隱藏著著多重的異常處理。 今天在看lodash的源碼中slice這個函數(shù)實現(xiàn)的時候發(fā)現(xiàn)了里面有這么一行代碼 length = start > end ? 0 : ((end - start) >>> ...
摘要:寫在最前本次分享一下通過實現(xiàn)算法的動畫效果來試圖展示的基本思路。算法的關(guān)鍵是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達到快速匹配的目的。本次主要通過動畫演示的方式展現(xiàn)樸素算法與算法對比過程的異同從而試圖理解的基本思路。 寫在最前 本次分享一下通過實現(xiàn)kmp算法的動畫效果來試圖展示kmp的基本思路。 歡迎關(guān)注我的博客,不定期更新中—— 前置概念 字符串匹配 字符串匹配是計算...
摘要:注意這里我說的是一般情況下,因為哈希算法需要兼顧性能與準(zhǔn)確性,是有一定概率出現(xiàn)重復(fù)的情況的。哈希算法實際上是數(shù)學(xué)家和計算機基礎(chǔ)科學(xué)家研究的領(lǐng)域。 背景 做了幾年 CRUD 工程師,深感自己的計算機基礎(chǔ)薄弱,在看了幾篇大牛的分享文章之后,發(fā)現(xiàn)很多人都是通過刷 LeetCode 來提高自己的算法水平。的確,通過分析解決實際的問題,比自己潛心研究書本效率還是要高一些。 一直以來遇到底層自己無...
摘要:程序入口方法淺析方法的方法簽名方法簽名講解修飾符類由虛擬機調(diào)用,為了沒有限制可以自由的調(diào)用,所以采用修飾符。返回值主方法被調(diào)用,將返回值返回給沒有任何意義,因此該方法沒有返回值,所以使用。 java程序入口main()方法淺析 main()方法的方法簽名 public static void main(String[] args) 方法簽名講解 ?public修飾符:java類由jav...
摘要:代碼優(yōu)化的最重要的作用應(yīng)該是避免未知的錯誤。此舉能夠使性能平均提高。拋出異常首先要創(chuàng)建一個新的對象,接口的構(gòu)造函數(shù)調(diào)用名為的本地同步方法,方法檢查堆棧,收集調(diào)用跟蹤信息。異常只能用于錯誤處理,不應(yīng)該用來控制程序流程。 showImg(https://segmentfault.com/img/remote/1460000015379073); 代碼優(yōu)化的最重要的作用應(yīng)該是:避免未知的錯誤...
閱讀 3623·2021-09-06 15:13
閱讀 1600·2021-09-02 10:19
閱讀 2547·2019-08-30 15:52
閱讀 981·2019-08-29 15:25
閱讀 1643·2019-08-26 18:36
閱讀 576·2019-08-26 13:23
閱讀 1407·2019-08-26 10:46
閱讀 3570·2019-08-26 10:41