java二進位相關基礎

来源:http://www.cnblogs.com/lirenzuo/archive/2017/12/05/7986239.html
-Advertisement-
Play Games

轉載請註明原創出處,謝謝! 說在前面 之前在 "JVM菜鳥進階高手之路十(基礎知識開場白)" 的時候簡單提到了二進位相關問題,最近在看RocketMQ的源碼的時候,發現涉及二進位的內容蠻多,jdk源碼裡面也是有很多涉及到二進位相關的操作,今天這篇文章僅僅是掃盲篇,後續會介紹靈活運用篇。 說明 任何東 ...


轉載請註明原創出處,謝謝!

說在前面

之前在JVM菜鳥進階高手之路十(基礎知識開場白)的時候簡單提到了二進位相關問題,最近在看RocketMQ的源碼的時候,發現涉及二進位的內容蠻多,jdk源碼裡面也是有很多涉及到二進位相關的操作,今天這篇文章僅僅是掃盲篇,後續會介紹靈活運用篇。

說明

任何東西都有規範,提到JAVA就會提到2個規範,JAVA語言規範、JVM規範。JAVA語言規範主要定義JAVA的語法、變數、類型、文法等等,JVM規範主要定義Class文件類型、運行時數據、幀棧、虛擬機的啟動、虛擬機的指令集等等。

  • JAVA語言規範主要定義什麼是JAVA語言。
  • JVM規範主要定義JVM內部實現,二進位class文件和JVM指令集等。

規範中數字的內部表示和存儲

JAVA八種基本數據類型:
整形:byte,short,int,long
浮點型:float,double
布爾型:boolean
字元型:char

數據類型 所占位數
int 32bit
short 16bit
long 64bit
byte 8bit
char 16bit
float 32bit
double 64bit
boolean 1bit

備註:1位元組=8位(1 byte = 8bit)

整數的表示

  • 源碼:第一位為符號位(0表示正數,1表示負數)。
  • 反碼:符號位不動,原碼取反。
  • 負數補碼:符號位不動,反碼加1。
  • 正數補碼:和源碼相同。

    備註:補碼的好處:
    • 使用補碼可以沒有任何歧義的表示0。
    • 補碼可以很好的參與二進位的運算,補碼相加符號位參與運算,這樣就簡單很多了。

浮點數表示

在上圖中,我們瞭解到Float與Double都是支持IEEE 754

我們以float來說明:

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

一個實數V在IEEE 754標準中可以用V=(-1)s×M×2E 的形式表示,說明如下:

  • 符號s(sign)決定實數是正數(s=0)還是負數(s=1),對數值0的符號位特殊處理。
  • 有效數字M(significand)是二進位小數,M的取值範圍在1≤M<2或0≤M<1。
  • 指數E(exponent)是2的冪,它的作用是對浮點數加權。
符號位 指數位 小數位
1位 8位 23位

例如根據IEEE754,計算11000001000100000000000000000000的單精度浮點的值。

解題:

1 10000010 00100000000000000000000
符號位 指數 尾數由於指數不是全部為0 所以小數位附加1
1 10000010 1.00100000000000000000000
-1 2^(130-127) (2^0 + 2^-3)

結論:
-1 * (2^0 + 2^-3) * 2^(130-127) =-9

同樣,你也可以驗證一下十進位浮點數0.1的二進位形式是否正確,你會發現,0.1不能表示為有限個二進位位,因此在記憶體中的表示是舍入(rounding)以後的結果,即 0x3dcccccd, 十進位為0.100000001, 誤差0.000000001由此產生了。

說到這裡JVM菜鳥進階高手之路十(基礎知識開場白)的有些問題其實都解答了,所以涉及到錢的小數類型必須使用BigDecimal,禁止使用float和double。

進位的概念

我們常用的進位有二進位、八進位、十進位和十六進位,十進位是最主要的表達形式。

二進位是0和1;八進位是0-7;十進位是0-9;十六進位是0-9+A-F(大小寫均可)。

位運算符

按位與(&)

兩位全為1,結果才為1:

0&0=00&1=01&0=01&1=1

用法:

  • 清零:如果想要一個單位清零,那麼使其全部二進位為0,只要與一個各位都為零的數值想與,結果為零。
  • 取一個數中指定位:找一個數,對應X要取的位,該數的對應位為1,其餘位為零,此數與X進行“與運算”可以得到X中的指定位。

例如:設X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到。

按位或(|)

只要有一個為1,結果就為1:

0|0=00|1=11|0=11|1=1

用法:常用來對一個數據的某些位置1;找到一個數,對應X要置1的位,該數的對應位為1,其餘位為零。此數與X相或可使X中的某些位置1。

例如:將X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到。

異或運算(^)

兩個相應位為“異”(值不同),則該位結果為1,否則為0:

0^0=00^1=11^0=11^1=0

用法:

  • 使特定位翻轉:找一個數,對應X要翻轉的各位,該數的對應位為1,其餘位為零,此數與X對應位異或就可以得到;
    例如:X=1010 1110,使X低4位翻轉,用X ^ 0000 1111 = 1010 0001就可以得到
  • 與0相異或,保留原值
    例如:X ^ 0000 0000 = 1010 1110
  • 兩個變數交換值的方法:
    1、藉助第三個變數來實現: C=A; A=B; B=C;
    2、 利用加減法實現兩個變數的交換:A=A+B; B=A-B;A=A-B;
    3、用位異或運算來實現:利用一個數異或本身等於0和異或運算符合交換律
    例如:A = A ^ B; B = A ^ B; A = A ^ B;

取反運算(~)

對於一個二進位數按位取反,即將0變1,1變0: ~1=0; ~0=1;

左移運算(<<)

  • 將一個運算對象的各二進位位全部左移若幹位(左邊的二進位丟棄,右邊補零)
    2<<1 = 4 : 10 <<1 =100=4
  • 若左移時捨棄的高位不包括1,則每左移一位,相當於該數乘以2。
    -14(二進位:1111 0010)<< 2= (1100 1000) (高位包括1,不符合規則)

右移運算(>>)

將一個數的各二進位位全部右移若幹位,正數左補0,負數左補1,右邊丟棄。操作數每右移一位,相當於該數除以2.

左補0 or 補1 得看被移數是正還是負。
例:4 >> 2 = 1
例:-14(1111 0010) >> 2 = -4 (1111 1100 )

無符號右移運算(>>>)

各個位向右移指定的位數。右移後左邊突出的位用零來填充。移出右邊的位被丟棄
各個位向右移指定的位數。右移後左邊突出的位用零來填充。移出右邊的位被丟棄
例如: -14>>>2
即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
=(0011 1111 1111 1111 1111 1111 1111 1100)
= 1073741820

Java列印整數的二進位表示

int a = 1120429670;
for (int i = 0; i < 32; i++) {
    int t = (a & 0x80000000 >>> i) >>> (31 - i);
    System.out.print(t);
}

說明:

  • 0x80000000是數的十六進位表示,轉成二進位表示為10000000000000000000000000000000
  • 運算的優先順序,移位運算高於邏輯運算,>>>高於&
  • 位邏輯與運算 1&1 = 1 ,0&1 = 0
  • >>>無符號右移,移出部分捨棄,左邊位補0;

歡迎積極留言討論關於你在實際運用中瞭解到二進位的一些優秀實踐,期待你的留言!!!

如果讀完覺得有收穫的話,歡迎點贊、關註、加公眾號【匠心零度】。


個人公眾號,歡迎關註,查閱更多精彩歷史!!!
匠心零度公眾號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 北京的冬越來越冷。但是擋不住戰士們勇往直前激情(一大清早地鐵站依舊還是辣麽多人排隊~激情四射的)。 今天分享兩個電子相冊。 動畫版: 因為圖片地址是本地地址所以賦效果圖給各位大神指點: 各位看客老爺肯定說說好的兩個相冊呢? O(∩_∩)O哈哈~別急。。請看下一篇博文~ 忘了這個了commom: ...
  • 官網:https://daneden.github.io/animate.css/ animate.css 是一款跨瀏覽器的動畫庫。 使用方式: 在頁面的 <head>中引入樣式文件: 給你想要添加動畫效果的元素加上 animated 樣式,如果想要動畫迴圈執行的話,你需要加上 infinite 樣 ...
  • 方案描述:由於採用單頁面,所以按鈕切換時會刷新頁面 1、安裝 react-intl babel-plugin-react-intl json-loader 2、修改webpack.config.js 與 webpack.production.config.js entry: { en_US: pat ...
  • HTML其實還是蠻容易學習的,無非就是一些標簽、格式的填寫,大學的時候也做過網站設計,所以這裡主要記錄一些常用的HTML標簽、屬性以及書寫方法等。 一、常見HTML格式 主要包含文件type,html標簽、head標簽、body標簽三個主題標簽,其中Head主要包含字元集、描述、關鍵字等信息,而Bo ...
  • href="{$CATEGORYS[45][url]}" 鏈接寫法, {$CATEGORYS[45][catname]} 標題寫法在show頁面中 src="{$thumb}" 圖片展示 {$content};文字內容 ...
  • Ajax大家每天都在用,jquery庫對Ajax的封裝也很完善、很好用,下麵我們看一下他的內部原理,並手動封裝一個自己的Ajax庫。 更多有關ajax封裝及數據處理,請參看上海尚學堂《Ajax中replace+Jq封裝的ajax》、《ajax+json數據處理》 一、原理 原生Ajax的發送需要四步 ...
  • 當元素變為position:absolute時,該元素不占據文檔流,text-align:center失效,則可以通過上述方法使元素中的內容垂直水平居中。 或者: 如果僅僅時元素中的文字居中的話, 給該元素加width:100%;text-align:center;就可以成功實現了。 ...
  • 1. 引言 搞Java的弟兄們肯定都想要達到更高的境界,用更少的代碼解決更多的問題,用更清晰的結構為可能的傳承和維護做準備。想想當初自己摸著石頭過河,也看過不少人介紹的學習路線,十多年走過來多少還是有些收穫。現通過自身經歷總結一篇文章,供弟兄們參考。 2. 用好正在用的框架 在已經加入的團隊中,和大 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...