JAVA中的進(jìn)制也算是面試中經(jīng)常會(huì)遇到的一個(gè)知識(shí)點(diǎn),不管是計(jì)算問(wèn)題,還是涉及到的基礎(chǔ)知識(shí)。因此這篇文章對(duì)其進(jìn)行一個(gè)整理。主要參考了慕課網(wǎng)上的視頻,特在此說(shuō)明。不管是你初學(xué)者還是工作中,又或者是找工作中。本文都能對(duì)你有所幫助。
本篇文章主要解決以下幾個(gè)問(wèn)題:
1、二進(jìn)制的歷史
2、java中的進(jìn)制轉(zhuǎn)換
3、java中的移位運(yùn)算
4、數(shù)據(jù)大小端問(wèn)題
5、進(jìn)制在java中的使用
下面我們就針對(duì)這些問(wèn)題,來(lái)分析一下java中的進(jìn)制。
一、二進(jìn)制的歷史
這一小節(jié)優(yōu)點(diǎn)閑扯淡的感覺(jué),要說(shuō)二進(jìn)制的歷史其實(shí)可以追述到一個(gè)大數(shù)學(xué)家萊布尼茨。當(dāng)時(shí)有一個(gè)法國(guó)傳教士白晉來(lái)到了咱們中國(guó),走的時(shí)候帶走了中國(guó)的一本古書(shū)《易經(jīng)》,白晉回到德國(guó)之后,萊布尼茨就看了《易經(jīng)》里面的伏羲八卦圖。突然靈機(jī)一動(dòng)(動(dòng)沒(méi)動(dòng)是我瞎猜的),就發(fā)明了二進(jìn)制。不管不管怎么樣二進(jìn)制的由來(lái)或多或少都收到了中國(guó)伏羲八卦圖的影響。

這就是伏羲八卦圖,怎么想到的我也不知道,不過(guò)你仔細(xì)觀察看一下,最上面的乾卦三橫實(shí)線,順時(shí)針轉(zhuǎn)動(dòng),實(shí)線變虛線。你可以想象成從000到111的變化。
二、java中的進(jìn)制轉(zhuǎn)換
其實(shí)常見(jiàn)的進(jìn)制轉(zhuǎn)換主要有以下幾種:
(1)十進(jìn)制轉(zhuǎn)二進(jìn)制
(2)十進(jìn)制轉(zhuǎn)八進(jìn)制
(3)十進(jìn)制轉(zhuǎn)十六進(jìn)制
(4)二進(jìn)制轉(zhuǎn)十進(jìn)制
(5)八進(jìn)制轉(zhuǎn)十進(jìn)制
(6)十六進(jìn)制轉(zhuǎn)十進(jìn)制
十進(jìn)制的范圍就是0-9,二進(jìn)制的范圍是0-1,八進(jìn)制的范圍是0-7,十六進(jìn)制的范圍是0-f。java提供了工具類(lèi)來(lái)實(shí)現(xiàn)進(jìn)制的轉(zhuǎn)換。因此在筆試的時(shí)候你可以直接使用。

然后我們運(yùn)行一下就可以直接看到結(jié)果了。比較簡(jiǎn)單。
三、java中的位操作
java中為了使得運(yùn)算方便而且快速,可以直接進(jìn)行位操作進(jìn)行運(yùn)算。常見(jiàn)的有以下六種:







上面這幾張圖,主要是概念用法。下面我們看位運(yùn)算的幾個(gè)應(yīng)用: (1) 判斷int型變量a是奇數(shù)還是偶數(shù) a&1 = 0 偶數(shù) a&1 = 1 奇數(shù)
(2) 取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (先右移再與1)
(3) 將int型變量a的第k位清0,即a=a&~(1<<k) (10000 取反后為00001 )
(4) 將int型變量a的第k位置1,即a=a|(1<<k)
(5) int型變量循環(huán)左移k次,即a=a<<k|a>>16-k (設(shè)sizeof(int)=16)
(6) int型變量a循環(huán)右移k次,即a=a>>k|a<<16-k (設(shè)sizeof(int)=16)
(7)對(duì)于一個(gè)數(shù) x >= 0,判斷是不是2的冪。

(8)不用temp交換兩個(gè)整數(shù)

(9)計(jì)算絕對(duì)值

(10)取模運(yùn)算轉(zhuǎn)化成位運(yùn)算 (在不產(chǎn)生溢出的情況下)
a % (2^n) 等價(jià)于 a & (2^n - 1)
(11)乘法運(yùn)算轉(zhuǎn)化成位運(yùn)算 (在不產(chǎn)生溢出的情況下)
a * (2^n) 等價(jià)于 a<< n
四、大小端問(wèn)題
1、小端法(Little-Endian)
低位字節(jié)排放在內(nèi)存的低地址端即該值的起始地址,高位字節(jié)排放在內(nèi)存的高地址端
2、高端法(Big-Endian)
高位字節(jié)排放在內(nèi)存的低地址端即該值的起始地址,低位字節(jié)排放在內(nèi)存的高地址端
為什么會(huì)有大小端呢?
在計(jì)算機(jī)中,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié)(8bit)數(shù)據(jù)。java中int類(lèi)型占據(jù)4個(gè)字節(jié),long占據(jù)8個(gè)字節(jié),計(jì)算機(jī)是由32位和64位之分的,處理器因此也就是有32位和64位之分,現(xiàn)在有一個(gè)32位的處理器,突然來(lái)了一個(gè)8字節(jié)64位的數(shù)據(jù),這時(shí)候處理器就不能一下子處理了,于是就要把8個(gè)字節(jié)的數(shù)據(jù)分開(kāi)存放,這一存放就要分出個(gè)高地了,誰(shuí)在前面誰(shuí)在后面的問(wèn)題。
比如說(shuō)下面的這個(gè)例子(前幾天做的一道面試原題):
小端情況

大端情況

這個(gè)在大端模式下是正常的。牢記牢記。
五、進(jìn)制的使用場(chǎng)景
上面在介紹的時(shí)候其實(shí)說(shuō)了一部分,但是這里再簡(jiǎn)單的舉個(gè)例子,最常見(jiàn)的例子就是序列化。我們知道客戶端我們可以使用java語(yǔ)言編寫(xiě),但是服務(wù)器就不一定了,可能是java,也可能是C++,這時(shí)候傳輸數(shù)據(jù)怎么辦呢?這倆語(yǔ)言之間又相互不認(rèn)識(shí)。這時(shí)候客戶端java就可以把我們的數(shù)據(jù)切分序列化成二進(jìn)制數(shù),二進(jìn)制數(shù)計(jì)算機(jī)到哪都能認(rèn)識(shí),這時(shí)候把二進(jìn)制數(shù)發(fā)送到服務(wù)端,服務(wù)端按照一定的規(guī)則反序列化就OK了。
對(duì)于字符串來(lái)說(shuō)那就是太簡(jiǎn)單了,我們直接getBytes就可以轉(zhuǎn)化成byte。但是對(duì)于int該怎么辦呢?我們給出一個(gè)例子,其他的可以自己測(cè)試一下。

OK,進(jìn)制中常見(jiàn)的問(wèn)題先列出這么多,歡迎批評(píng)指正。