這篇文章帶給大家的內容是關於Java位運算的介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
我們都知道,在電腦世界裡,再複雜,再美的程序,到最後都會變成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)); }
再看解釋之前,我們先猜猜看結果是多少?
程式碼解釋:
位元與:我們從字面意思來理解,也是二進位位元的與操作。
數字 8 的十進位是: 1000 。
數字 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<
現在我們來速算一下:
當a = 13, n = 2 時。 13<<2 等於 13* 4 = 52 。 13/4 = 3。
(上述速數演算法,如有錯誤,歡迎打臉!!!)
我們在原始碼以及常見演算法中位移運算是非常常見的,一位Java程式設計師掌握位元運算也是很有必要的。這對我們演算法,原始碼理解都非常有幫助!
以上是Java位元運算的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!