一些java二進制的相關(guān)基礎(chǔ)知識
說明
任何東西都有規(guī)范,提到JAVA就會提到2個規(guī)范,JAVA語言規(guī)范、JVM規(guī)范。JAVA語言規(guī)范主要定義JAVA的語法、變量、類型、文法等等,JVM規(guī)范主要定義Class文件類型、運行時數(shù)據(jù)、幀棧、虛擬機的啟動、虛擬機的指令集等等。
- JAVA語言規(guī)范主要定義什么是JAVA語言。
- JVM規(guī)范主要定義JVM內(nèi)部實現(xiàn),二進制class文件和JVM指令集等。
規(guī)范中數(shù)字的內(nèi)部表示和存儲
JAVA八種基本數(shù)據(jù)類型:
- 整形:byte,short,int,long
- 浮點型:float,double
- 布爾型:boolean
- 字符型:char
- 數(shù)據(jù)類型 所占位數(shù)
| 數(shù)據(jù)類型 | 所占位數(shù) |
|---|---|
| int | 32bit |
| short | 16bit |
| long | 64bit |
| byte | 8bit |
| char | 16bit |
| float | 32bit |
| double | 64bit |
| boolean | 1bit |
備注:1字節(jié)=8位(1 byte = 8bit)


整數(shù)的表示
- 源碼:第一位為符號位(0表示正數(shù),1表示負數(shù))。
- 反碼:符號位不動,原碼取反。
- 負數(shù)補碼:符號位不動,反碼加1。
- 正數(shù)補碼:和源碼相同。
備注:補碼的好處:
使用補碼可以沒有任何歧義的表示0。
補碼可以很好的參與二進制的運算,補碼相加符號位參與運算,這樣就簡單很多了。
浮點數(shù)表示
在上圖中,我們了解到Float與Double都是支持IEEE 754
我們以float來說明:

IEEE745單精度浮點格式共32位,包含三個構(gòu)成字段:23位小數(shù)f,8位偏置指數(shù)e,1位符號s。將這些字段連續(xù)存放在一個32位字里,并對其進行編碼。其中0:22位包含23位的小數(shù)f; 23:30位包含8位指數(shù)e;第31位包含符號s。

一個實數(shù)V在IEEE 754標準中可以用V=(-1)s×M×2E 的形式表示,說明如下:
- 符號s(sign)決定實數(shù)是正數(shù)(s=0)還是負數(shù)(s=1),對數(shù)值0的符號位特殊處理。
- 有效數(shù)字M(significand)是二進制小數(shù),M的取值范圍在1≤M<2或0≤M<1。
- 指數(shù)E(exponent)是2的冪,它的作用是對浮點數(shù)加權(quán)。
| 符號位 | 指數(shù)位 | 小數(shù)位 |
|---|---|---|
| 1位 | 8位 | 23位 |
例如根據(jù)IEEE745,計算11000001000100000000000000000000的單精度浮點的值。
解題:
| 1 | 10000010 | 00100000000000000000000 |
|---|---|---|
| 符號位 | 指數(shù) | 尾數(shù)由于指數(shù)不是全部為0 所以小數(shù)位附加1 |
| 1 | 10000010 | 1.00100000000000000000000 |
| -1 | 2^(130-127) | (2^0 + 2^-3) |
結(jié)論:-1 * (2^0 + 2^-3) * 2^(130-127) =-9
同樣,你也可以驗證一下十進制浮點數(shù)0.1的二進制形式是否正確,你會發(fā)現(xiàn),0.1不能表示為有限個二進制位,因此在內(nèi)存中的表示是舍入(rounding)以后的結(jié)果,即 0x3dcccccd, 十進制為0.100000001, 誤差0.000000001由此產(chǎn)生了。
進制的概念
我們常用的進制有二進制、八進制、十進制和十六進制,十進制是最主要的表達形式。
二進制是0和1;八進制是0-7;十進制是0-9;十六進制是0-9+A-F(大小寫均可)。
位運算符
按位與(&)
兩位全為1,結(jié)果才為1:
0&0=0; 0&1=0; 1&0=0; 1&1=1;
用法:
- 清零:如果想要一個單位清零,那么使其全部二進制為0,只要與一個各位都為零的數(shù)值想與,結(jié)果為零。
- 取一個數(shù)中指定位:找一個數(shù),對應(yīng)X要取的位,該數(shù)的對應(yīng)位為1,其余位為零,此數(shù)與X進行“與運算”可以得到X中的指定位。
例如:設(shè)X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到。
按位或(|)
只要有一個為1,結(jié)果就為1:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
用法:常用來對一個數(shù)據(jù)的某些位置1;找到一個數(shù),對應(yīng)X要置1的位,該數(shù)的對應(yīng)位為1,其余位為零。此數(shù)與X相或可使X中的某些位置1。
例如:將X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到。
異或運算(^)
*兩個相應(yīng)位為“異”(值不同),則該位結(jié)果為1,否則為0: *
0^0=0; 0^1=1; 1^0=1; 1^1=0;
用法:
- 使特定位翻轉(zhuǎn):找一個數(shù),對應(yīng)X要翻轉(zhuǎn)的各位,該數(shù)的對應(yīng)位為1,其余位為零,此數(shù)與X對應(yīng)位異或就可以得到; 例如:X=1010 1110,使X低4位翻轉(zhuǎn),用X ^ 0000 1111 = 1010 0001就可以得到
- 與0相異或,保留原值 例如:X ^ 0000 0000 = 1010 1110
- 兩個變量交換值的方法: 1、借助第三個變量來實現(xiàn): C=A; A=B; B=C; 2、 利用加減法實現(xiàn)兩個變量的交換:A=A+B; B=A-B;A=A-B; 3、用位異或運算來實現(xiàn):利用一個數(shù)異或本身等于0和異或運算符合交換律 例如:A = A ^ B; B = A ^ B; A = A ^ B;
取反運算(~)
對于一個二進制數(shù)按位取反,即將0變1,1變0: ~1=0; ~0=1;
左移運算(<<)
將一個運算對象的各二進制位全部左移若干位(左邊的二進制丟棄,右邊補零) 2<<1 = 4 : 10 <<1 =100=4
若左移時舍棄的高位不包括1,則每左移一位,相當于該數(shù)乘以2。 -14(二進制:1111 0010)<< 2= (1100 1000) (高位包括1,不符合規(guī)則)
右移運算(>>)
將一個數(shù)的各二進制位全部右移若干位,正數(shù)左補0,負數(shù)左補1,右邊丟棄。操作數(shù)每右移一位,相當于該數(shù)除以2.
左補0 or 補1 得看被移數(shù)是正還是負。
例:4 >> 2 = 1
例:-14(1111 0010) >> 2 = -4 (1111 1100 )
無符號右移運算(>>>)
各個位向右移指定的位數(shù)。右移后左邊突出的位用零來填充。移出右邊的位被丟棄
各個位向右移指定的位數(shù)。右移后左邊突出的位用零來填充。移出右邊的位被丟棄
例如: -14>>>2
即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
=(0011 1111 1111 1111 1111 1111 1111 1100)
= 1073741820
說明:
- 0x80000000是數(shù)的十六進制表示,轉(zhuǎn)成二進制表示為10000000000000000000000000000000
- 運算的優(yōu)先級,移位運算高于邏輯運算,>>>高于&
- 位邏輯與運算 1&1 = 1 ,0&1 = 0
- >>>無符號右移,移出部分舍棄,左邊位補0;
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問題
這篇文章主要介紹了解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
使用redis的increment()方法實現(xiàn)計數(shù)器功能案例
這篇文章主要介紹了使用redis的increment()方法實現(xiàn)計數(shù)器功能案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
springboot Controller直接返回String類型帶來的亂碼問題及解決
文章介紹了在Spring Boot中,當Controller直接返回String類型時可能出現(xiàn)的亂碼問題,并提供了解決辦法,通過在`application.yaml`中設(shè)置請求和響應(yīng)的編碼格式,并在自定義配置類中進行配置,可以有效解決這一問題2024-11-11
Java concurrency之公平鎖(二)_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細介紹了Java concurrency之公平鎖的第二篇內(nèi)容,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Java RocketMQ 路由注冊與刪除的實現(xiàn)
這篇文章主要介紹了Java RocketMQ 路由注冊與刪除的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

