中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

說說Java 位運算

發布時間:2020-06-21 23:48:00 來源:網絡 閱讀:310 作者:菜鳥騫 欄目:編程語言
本文首發于個人微信公眾號《andyqian》,期待你的關注~
前言

   我們都知道,在計算機世界里,再復雜,再美的程序,到最后都會變成0與1。也就是我們常說的:二進制。二進制相信大家都很熟悉。與現實世界不同的是,在現實世界里,我們通常都是用十進制來表示的,也就是遇十進一,這些都是我們熟悉的。到這里,我們就會發現端倪,現實世界中的十進制與計算機中的二進制其計量單元是不一樣的。那它們之間怎么轉換呢?這就涉及到一些比較基礎的計算機知識。不在本文中討論(如果有興趣,可以在下次講講)。嗯,回到今天的主題,來說說位運算,這又是一個怎樣的概念呢?我們從小就開始接觸,現實世界中的加減乘除這些運算,也就是十進制中的運算。今天我們要說的是:二進制位中的一些常用運算。例如:& (位與)| (位或) ,^(異或)<<(左移)>>(右移) 等等。

真與假

  在進行運算符使用之前,我們有必要說下真假。在Java中,我們都知道,用 true 值表示真,false 值表示假。其實在計算機中,通常使用 1 表示真,0表示假。使用過Json的同學應該知道,Java中的boolean類型,用1也是可以反序列化成true,0反序列化為false的。

& (位與)

   在說位與之前,我們先來說說我們熟悉的 && 邏輯與操作。簡單來說: A&&B  也就是:A且B同時成立時為真,否則為假。也有人稱之為:“一假必假”。

現在我們再來看位與。首先,我們來看一段程序:

 @Test
   public void testBit(){
       int a = 8;
       int b = 9;
       System.out.println("a binary: "+Integer.toBinaryString(a));
       System.out.println("b binary: "+Integer.toBinaryString(b));
       System.out.println("a & b binary: "+Integer.toBinaryString(a&b));
       System.out.println("a & b result: "+(a&b));
   }

再看解釋之前,我們先猜猜結果是多少?

代碼解釋

位與:我們從字面意思上來理解,也是二進制位的與操作。

  1. 數字 8 的十進制是: 1000 。

  2. 數字 9 的十進制是: 1001。


我們再來進行位于操作:

如下所示:

8:1000
9:1001
&
8  1000

最左邊的 1&1 = 1,中間的 0&0 = 0,最右邊的0&1 = 0。

二進制的結果為:1000,轉換為10進制后為 8。

程序運行結果如下:

a binary: 1000
b binary: 1001
a & b binary: 1000
a & b result: 8

結果是符合預期的。

| (位或)

  上面說 & (位與) 操作,現在我們來看看位或操作,繼續使用上面的例子:如下所示:

 @Test
   public void testBit(){
       int a = 8;
       int b = 9;
       System.out.println("a binary: "+Integer.toBinaryString(a));
       System.out.println("b binary: "+Integer.toBinaryString(b));
       System.out.println("a & b binary: "+Integer.toBinaryString(a|b));
       System.out.println("a & b result: "+(a|b));
   }

再看看二進制:

8:1000
9:1001
|
9  1001

最左邊的 1|1 = 1,中間的0|0 = 0 ,最右邊的 0|1 = 1。

結果二進制為: 1001 對應的10進制為 9。

運算結果如下:

a binary: 1000
b binary: 1001
a & b binary: 1001
a & b result: 9
^(異或)

  這個運算符比較有意思,異從字面上來理解是:不同的。放在位操作里也是一樣的。繼續使用上面的例子:

@Test
   public void testBit(){
       int a = 8;
       int b = 9;
       System.out.println("a binary: "+Integer.toBinaryString(a));
       System.out.println("b binary: "+Integer.toBinaryString(b));
       System.out.println("a & b binary: "+Integer.toBinaryString(a^b));
       System.out.println("a & b result: "+(a^b));
   }

繼續看二進制:

8:1000
9:1001
^
1  0001

位相同時取假,不同時取真。左邊的 1=1 相同取假,也就是0。中間的0=0 也為假為0。最右邊的0不等于1,為真。結果也就為1。

<<(左移)

  在現實世界里,我們經常使用乘法。<< 則表示二進制中的位移操作,低位補0。例如:8<<1。

@Test
   public void testCode(){
       int a =8;
       System.out.println("a toBinaryString: "+Integer.toBinaryString(a));
       System.out.println("a<<1 toBinaryString: "+Integer.toBinaryString(a<<1));
       System.out.println("result: "+(a<<1));

二進制如下:

8  1000
8<<1
16 10000

結果為: 2^4  = 16。  << 左邊 a 表示基數, 右邊 1 則表示需要位移動的位數。 箭頭指向哪邊,則向哪邊位移。程序運行結果:

a toBiryString: 1000
a<<1 toBinaryString: 10000
result: 16
>> 右移

  >>(右移) 與左移 <<  則是相反的,高位補0 。繼續上面的例子:

@Test
   public void testCode(){
       int a =8;
       System.out.println("a toBinaryString: "+Integer.toBinaryString(a));
       System.out.println("1>>a toBinaryString: "+Integer.toBinaryString(a>>1));
       System.out.println("result: "+(a>>1)
   }

二進制:

8 : 1000
8>>1
4 : 0100

運行結果:

a toBinaryString: 1000
a>>1 toBinaryString: 100
result: 4

其實這里還有一個比較好記的口訣:

a>>n 則表示: a / (2^n) 次方。  (取整)

a<<n 則結果為: a * (2^n) 次方。

現在我們來速算一下:

當a = 13, n = 2 時。13<<2 等于  13* 4 = 52 。 13/4 = 3。

(上述速算法,如有錯誤,歡迎打臉!!!)



   我們在源碼以及常見算法中位移運算是非常常見的,一位Java程序員掌握位運算也是很有必要的。這對我們算法,源碼理解都非常有幫助!



相關閱讀:

《上千行存儲過程有感!》

《軟件之路》

《淺談 Java JPDA》

《說說MySQL權限》

說說Java 位運算


向AI問一下細節

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

AI

花垣县| 册亨县| 娄底市| 察哈| 新闻| 大厂| 若尔盖县| 吉首市| 祁门县| 辽宁省| 吴堡县| 林州市| 开鲁县| 凤山县| 宜兰市| 永城市| 达尔| 嘉义县| 大渡口区| 美姑县| 大埔区| 化德县| 胶南市| 英德市| 黔西县| 罗定市| 信阳市| 舞阳县| 霍林郭勒市| 外汇| 淮阳县| 章丘市| 阿尔山市| 略阳县| 靖安县| 虎林市| 灵台县| 长宁县| 迁西县| 广汉市| 敦煌市|