說說Java位運(yùn)算-創(chuàng)新互聯(lián)

本文首發(fā)于個(gè)人微信公眾號(hào)《andyqian》,期待你的關(guān)注~
前言

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

10余年的察哈爾右翼后網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營銷型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整察哈爾右翼后建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“察哈爾右翼后網(wǎng)站設(shè)計(jì)”,“察哈爾右翼后網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
真與假

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

& (位與)

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

現(xiàn)在我們?cè)賮砜次慌c。首先,我們來看一段程序:

 @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));
  }

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

代碼解釋

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

  1. 數(shù)字 8 的十進(jìn)制是: 1000 。

  2. 數(shù)字 9 的十進(jìn)制是: 1001。


我們?cè)賮磉M(jìn)行位于操作:

如下所示:

8:1000
9:1001
&
8  1000

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

二進(jìn)制的結(jié)果為:1000,轉(zhuǎn)換為10進(jìn)制后為 8。

程序運(yùn)行結(jié)果如下:

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

結(jié)果是符合預(yù)期的。

| (位或)

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

 @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));
  }

再看看二進(jìn)制:

8:1000
9:1001
|
9  1001

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

結(jié)果二進(jìn)制為: 1001 對(duì)應(yīng)的10進(jìn)制為 9。

運(yùn)算結(jié)果如下:

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

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

@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));
  }

繼續(xù)看二進(jìn)制:

8:1000
9:1001
^
1  0001

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

<<(左移)

  在現(xiàn)實(shí)世界里,我們經(jīng)常使用乘法。<< 則表示二進(jìn)制中的位移操作,低位補(bǔ)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));

二進(jìn)制如下:

8  1000
8<<1
16 10000

結(jié)果為: 2^4  = 16。  << 左邊 a 表示基數(shù), 右邊 1 則表示需要位移動(dòng)的位數(shù)。 箭頭指向哪邊,則向哪邊位移。程序運(yùn)行結(jié)果:

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

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

@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)
  }

二進(jìn)制:

8 : 1000
8>>1
4 : 0100

運(yùn)行結(jié)果:

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

其實(shí)這里還有一個(gè)比較好記的口訣:

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

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

現(xiàn)在我們來速算一下:

當(dāng)a = 13, n = 2 時(shí)。13<<2 等于  13* 4 = 52 。 13/4 = 3。

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



  我們?cè)谠创a以及常見算法中位移運(yùn)算是非常常見的,一位Java程序員掌握位運(yùn)算也是很有必要的。這對(duì)我們算法,源碼理解都非常有幫助!



相關(guān)閱讀:

《上千行存儲(chǔ)過程有感!》

《軟件之路》

《淺談 Java JPDA》

《說說MySQL權(quán)限》

說說Java 位運(yùn)算

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:說說Java位運(yùn)算-創(chuàng)新互聯(lián)
新聞來源:http://muchs.cn/article34/dsjppe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站建設(shè)商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)