91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺析java移位符的具體使用

發布時間:2020-09-07 05:51:26 來源:腳本之家 閱讀:96 作者:CodeAres 欄目:編程語言

概述

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 

<font color=red>0000</font> 0000 0000 0000 0000 0000 0000 0001 <font color=blue>0000</font> (紅色被移除截斷,藍色是新補的0) 1*2^4=16

-1 << 3

我們開始第二個輸出語句,這是一個負數。負數的反碼是他的源碼符號位不變,其余按位取反。補碼是他的反碼加一。
所以我們可以得到-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

對補碼進行操作得<font color=red>111</font> 1111 1111 1111 1111 1111 1111 1111 1<font color=blue>000</font> (紅色被移除截斷,藍色是新補的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

運算后結果:<font color=blue>000</font>0 0000 0000 0000 0000 0000 0000 0001 <font color=red>000</font> 1*2^0=1(紅色被移除截斷,藍色是新補的符號位,并且以原來的符號位填補)

-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

運算后結果:<font color=blue>111</font>1 1111 1111 1111 1111 1111 1111 1111 <font color=red>000</font> (紅色被移除截斷,藍色是新補的符號位,并且以原來的符號位填補)
轉換為源碼為: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

運算后結果:<font color=yellow>000</font>1 1111 1111 1111 1111 1111 1111 1111 <font color=red>000</font> (紅色被移除截斷,注意黃色部分,在無符號右移運算位中統一補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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

礼泉县| 蕲春县| 金昌市| 临泽县| 泸西县| 水富县| 鸡泽县| 高邑县| 鹤峰县| 锦州市| 永宁县| 罗山县| 庆阳市| 康平县| 襄城县| 抚宁县| 灵璧县| 息烽县| 乌鲁木齐市| 安达市| 奉贤区| 上犹县| 长岛县| 秭归县| 临高县| 涪陵区| 泌阳县| 八宿县| 尤溪县| 临沭县| 虹口区| 舟曲县| 淮滨县| 成安县| 德钦县| 长葛市| 临城县| 洛扎县| 阿尔山市| 西昌市| 论坛|