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