摘要:嗯,回到今天的主題,來說說位運(yùn)算,這又是一個(gè)怎樣的概念呢我們從小就開始接觸,現(xiàn)實(shí)世界中的加減乘除這些運(yùn)算,也就是十進(jìn)制中的運(yùn)算。今天我們要說的是二進(jìn)制位中的一些常用運(yùn)算。程序運(yùn)行結(jié)果右移右移與左移則是相反的,高位補(bǔ)。
本文首發(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)算。例如:& (位與),| (位或) ,^(異或),<<(左移),>>(右移) 等等。
真與假
在進(jìn)行運(yùn)算符使用之前,我們有必要說下真假。在Java中,我們都知道,用 true 值表示真,false 值表示假。其實(shí)在計(jì)算機(jī)中,通常使用 1 表示真,0表示假。使用過Json的同學(xué)應(yīng)該知道,Java中的boolean類型,用1也是可以反序列化成true,0反序列化為false的。
& (位與)
在說位與之前,我們先來說說我們熟悉的 && 邏輯與操作。簡(jiǎn)單來說: 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)制位的與操作。
數(shù)字 8 的十進(jìn)制是: 1000 。
數(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< 現(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)限》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73588.html
摘要:虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。總體來說就是,我們利用調(diào)用開發(fā)了屬于我們自己的程序后,通過中的編譯程序?qū)⑽覀兊奈谋疚募幾g成字節(jié)碼,在上運(yùn)行這些字節(jié)碼,解析這些字節(jié)碼,映射到指令集或的系統(tǒng)調(diào)用。 1.簡(jiǎn)述JDK、JRE、JVM? 一、JDK JDK(Java Development Kit) 是整個(gè)JAVA的核心, 包括了Java運(yùn)行環(huán)境(Java Ru...
摘要:虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。總體來說就是,我們利用調(diào)用開發(fā)了屬于我們自己的程序后,通過中的編譯程序?qū)⑽覀兊奈谋疚募幾g成字節(jié)碼,在上運(yùn)行這些字節(jié)碼,解析這些字節(jié)碼,映射到指令集或的系統(tǒng)調(diào)用。 1.簡(jiǎn)述JDK、JRE、JVM? 一、JDK JDK(Java Development Kit) 是整個(gè)JAVA的核心, 包括了Java運(yùn)行環(huán)境(Java Ru...
摘要:前言最近,朋友問了我這樣一個(gè)問題在中的運(yùn)算結(jié)果,為什么是這樣的雖然我告訴他說,這是由于浮點(diǎn)數(shù)精度問題導(dǎo)致的。由于可以用階碼移動(dòng)小數(shù)點(diǎn),因此稱為浮點(diǎn)數(shù)。它的實(shí)現(xiàn)遵循標(biāo)準(zhǔn),使用位精度來表示浮點(diǎn)數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018981071); 前言 最近,朋友 L 問了我這樣一個(gè)問題:在 chrome 中的運(yùn)算...
閱讀 2609·2021-11-18 10:02
閱讀 2279·2021-09-30 09:47
閱讀 1745·2021-09-27 14:01
閱讀 3110·2021-08-16 11:00
閱讀 3163·2019-08-30 11:06
閱讀 2392·2019-08-29 17:29
閱讀 1533·2019-08-29 13:19
閱讀 445·2019-08-26 13:54