JAVA中的進制也算是面試中經常會遇到的一個知識點,不管是計算問題,還是涉及到的基礎知識。因此這篇文章對其進行一個整理。主要參考了慕課網上的視頻,特在此說明。不管是你初學者還是工作中,又或者是找工作中。本文都能對你有所幫助。
本篇文章主要解決以下幾個問題:
1、二進制的歷史
2、java中的進制轉換
3、java中的移位運算
4、數據大小端問題
5、進制在java中的使用
下面我們就針對這些問題,來分析一下java中的進制。
一、二進制的歷史
這一小節優點閑扯淡的感覺,要說二進制的歷史其實可以追述到一個大數學家萊布尼茨。當時有一個法國傳教士白晉來到了咱們中國,走的時候帶走了中國的一本古書《易經》,白晉回到德國之后,萊布尼茨就看了《易經》里面的伏羲八卦圖。突然靈機一動(動沒動是我瞎猜的),就發明了二進制。不管不管怎么樣二進制的由來或多或少都收到了中國伏羲八卦圖的影響。
這就是伏羲八卦圖,怎么想到的我也不知道,不過你仔細觀察看一下,最上面的乾卦三橫實線,順時針轉動,實線變虛線。你可以想象成從000到111的變化。
二、java中的進制轉換
其實常見的進制轉換主要有以下幾種:
(1)十進制轉二進制
(2)十進制轉八進制
(3)十進制轉十六進制
(4)二進制轉十進制
(5)八進制轉十進制
(6)十六進制轉十進制
十進制的范圍就是0-9,二進制的范圍是0-1,八進制的范圍是0-7,十六進制的范圍是0-f。java提供了工具類來實現進制的轉換。因此在筆試的時候你可以直接使用。
然后我們運行一下就可以直接看到結果了。比較簡單。
三、java中的位操作
java中為了使得運算方便而且快速,可以直接進行位操作進行運算。常見的有以下六種:
上面這幾張圖,主要是概念用法。下面我們看位運算的幾個應用: (1) 判斷int型變量a是奇數還是偶數 a&1 = 0 偶數 a&1 = 1 奇數
(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型變量循環左移k次,即a=a<<k|a>>16-k (設sizeof(int)=16)
(6) int型變量a循環右移k次,即a=a>>k|a<<16-k (設sizeof(int)=16)
(7)對于一個數 x >= 0,判斷是不是2的冪。
(8)不用temp交換兩個整數
(9)計算絕對值
(10)取模運算轉化成位運算 (在不產生溢出的情況下)
a % (2^n) 等價于 a & (2^n - 1)
(11)乘法運算轉化成位運算 (在不產生溢出的情況下)
a * (2^n) 等價于 a<< n
四、大小端問題
1、小端法(Little-Endian)
低位字節排放在內存的低地址端即該值的起始地址,高位字節排放在內存的高地址端
2、高端法(Big-Endian)
高位字節排放在內存的低地址端即該值的起始地址,低位字節排放在內存的高地址端
為什么會有大小端呢?
在計算機中,每個地址單元都對應著一個字節(8bit)數據。java中int類型占據4個字節,long占據8個字節,計算機是由32位和64位之分的,處理器因此也就是有32位和64位之分,現在有一個32位的處理器,突然來了一個8字節64位的數據,這時候處理器就不能一下子處理了,于是就要把8個字節的數據分開存放,這一存放就要分出個高地了,誰在前面誰在后面的問題。
比如說下面的這個例子(前幾天做的一道面試原題):
小端情況
大端情況
這個在大端模式下是正常的。牢記牢記。
五、進制的使用場景
上面在介紹的時候其實說了一部分,但是這里再簡單的舉個例子,最常見的例子就是序列化。我們知道客戶端我們可以使用java語言編寫,但是服務器就不一定了,可能是java,也可能是C++,這時候傳輸數據怎么辦呢?這倆語言之間又相互不認識。這時候客戶端java就可以把我們的數據切分序列化成二進制數,二進制數計算機到哪都能認識,這時候把二進制數發送到服務端,服務端按照一定的規則反序列化就OK了。
對于字符串來說那就是太簡單了,我們直接getBytes就可以轉化成byte。但是對于int該怎么辦呢?我們給出一個例子,其他的可以自己測試一下。
OK,進制中常見的問題先列出這么多,歡迎批評指正。