JavaRush /Java Blog /Random-TW /Java:位元和位元組
Viacheslav
等級 3

Java:位元和位元組

在 Random-TW 群組發布
Java:位元和位元組 - 1

介紹

如果人們用十進制計數,那麼計算機就用二進制計數。程式設計師必須了解如何與人和電腦對話。這篇評論應該對解決這個問題有所幫助。有時候,顯而易見的事情背後隱藏著一個完整的世界。我提議談談這個世界。例如,一周有7天。現在我們來回答這個問題:數字「7」是什麼?)首先,它是一個整數(正)自然數。它也是一個十進制數。 十進制數是十進制系統中的數字。當我們說「十進制」時,意味著該數字系統的基數為 10。基數顯示在給定的數字系統中可以使用多少位數字來表示一個數字。倒數計時從零開始。因此,為了表示十進制數字系統中的數字,我們使用從 0 到 9 的數字。這很好,但我們不僅需要數到 9,還需要數到 9 以外的數字。怎樣成為?例如,數字 10。要寫這個數字,我們最多使用 2 位數字。十進制中每個數字的位置稱為小數位。數字從右到左計算:
Java:位元和位元組 - 2
另外,十進位數可以展開如下:103 = 1*10^2 + 0*10^1 + 3*10^0
Java:位元和位元組 - 3
該數字基本上是從右向左增長的。也就是一開始是7,後來變成了10。因此,數字是從右邊開始數,從0開始。這一切是為了什麼?這是因為我們不是計算機。我們以十進制(即基數 10)計數,而計算機則以二進位(即基數 2)計數。但這些數字系統中適用的規則是相同的。
Java:位元和位元組 - 4

二元系統

二進制和十進制很相似,唯一的差別是這裡的限制不是10,而是2。我們舉個例子來比較一下。我們如何用二進位表示 11?很簡單:只需要將十進制數除以基數 2,即一列中的 11/2 即可。例子:
Java:位元和位元組 - 5
或者這是來自 WikiHow 的範例:
Java:位元和位元組 - 6
有趣的是,我們可以用與十進制相同的方式表示二進制數:二進制 111 = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java:位元和位元組 - 7
從二進位到十進制的轉換範例可以在線上計算器中看到。說到數字系統中的運算規則是相同的,讓我們來看看二進位系統中的加法:
Java:位元和位元組 - 8
正如您所看到的,我們在加法過程中以與十進制系統相同的方式傳輸數字。加法的分析可以看,例如這裡: 順便說一句,“放電”一詞時常被提及。還有,這是什麼? 地點只是代表數字的「結構元素」。也就是說,數字 10 由兩個數字組成:我們需要 2 個數字、2 個位置、2 個元素來寫這個數字。理解這一點對我們來說很重要,因為在二進制數字系統中,一個數字就是一個位。Bit這個字源自於英文「二進位數字」,即二進位數。它可以是 0 或 1。但是,正如我們將數字和單字作為一個整體而不是一個字母一個字母地讀取一樣,計算機也不會一次讀取一位。對於RAM 中處理資訊的最小「片段」(所謂的最小可尋址資訊單元),讀取 8 位元序列。由於有 8 個,因此這一個被稱為「八位組」。還有-更廣為人知的單字Byte。要記住八位組,您可以記住單字octopus(八條腿)被翻譯成英文為octopus。也就是說,這裡與標題中的「octo」完全相同:
Java:位元和位元組 - 9
我們想一下,8位最多可以表示多少個數字?
Java:位元和位元組 - 10
這裡出現了一個問題:負數怎麼辦?為了理解這一點,我們先來談談Java中位元組是如何表示的
Java:位元和位元組 - 11

Java 和位元組

在Java中我們怎麼可以使用負數呢?很簡單就完成了。在 Java 中,位元組是有符號的。最左邊的數字/位(也稱為“最高有效位”)是一種“標記”,可以回答以下問題:“這個數字是負數嗎?” 如果答案是肯定的,則標記的值為 1。否則為 0。讓我們看一個如何將數字 5 變成負數 5 的範例:
Java:位元和位元組 - 12
根據這張圖,您可以了解 Byte 值的限制:
Java:位元和位元組 - 13
還明確的是:
  • 如果我們將 127 加 1,我們會得到 -128。
  • 如果我們從 -128 減去 1,就會得到 127。
因此,Java 中的 Byte 可以取 -128 到 127 之間的值。我們記得,一個位元組是一個八位元組。最大數字/最高有效位元的序號為 7,因為我們從零開始計數。在這種情況下,很容易記住,一個位元組等於-2的7次方(下限)到2的7次方減1(上限)。使用資料型別本身很簡單。我們使用線上 Java 編譯器「repl.it」作為本文的「沙箱」。https://repl.it/languages/java。例如,讓我們執行將二進位形式的位元組變數表示為字串的程式碼:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
在使用 I/O 流時,會積極使用位元組。您可以在 Oracle 教學中閱讀更多內容:「I/O Streams」。此外,在 Java 中,您可以使用特殊文字將值指定為位元:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java:位元和位元組 - 14

位元操作

談到位元組和位,就不能不提到各種位元操作。最常見的操作可能是移位(以位移位或位移位)。這一切都是因為他們的結果有明顯的實際好處。什麼用途?左移 N 個位置相當於將數字乘以 2N。向右移動類似於相同的除法。因此, 5<<2 == 5*Math.pow(2,2) 為了理解為什麼會這樣,讓我們更詳細地看這個例子:
Java:位元和位元組 - 15
位元否定 NOT(一元按位)以波浪號表示,可反轉位元。它被寫成波形符,例如~5。
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
這再次說明,Java改變數字的符號時,除了將最結尾的位值取反之外,我們還執行+1。如果沒有這個,正如我們所看到的,我們的數字 5 就會改變。為了使其保持與更改符號之前相同的數字,您需要執行 +1。只有當所有位元的值為 1 時,位元 AND 才允許您將兩個不同的數字保留為 1。有趣的是它可能具有一些應用優勢:
int x=4;
System.out.println((x&1) != 1);
此代碼檢查數字 x 的奇偶校驗。讓我們來看一個例子:
Java:位元和位元組 - 16
透過同時使用位元與和按位或,您可以使用遮罩:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
有關詳細信息,請參閱“ Java 中位元運算符的屏蔽選項” 。位元操作是一個有趣的主題,對此已有單獨的評論、文章和書籍撰寫。從這裡開始了通往密碼學的漫長道路。作為本次審查的一部分,有必要了解它為何有效以及如何運作。有關位元操作的更多信息,我建議閱讀 tproger 的評論:“關於位元操作”。

原始型

所以,一個位元組就是一個八位元組,也就是8位元。很容易記住,Java 中也有 8 種基本類型,巧合的是。基本類型是內建於程式語言中的資料類型,即預設可用的資料類型。就 Java 可以使用的記憶體佔用而言,位元組是最小的原始資料類型。正如我們前面所說,一個位元組佔用8位元。因此,最高有效位是數字7。因此,byte包含結果的從-2的7次方到2的7次方減1的值。還有哪些其他原始類型:
Java:位元和位元組 - 17
從表中我們可以看到,資料類型所佔用的資料量倍增。即short=2*byte,int=2*short。其實很容易記住。請記住,位元組 = 8 位元。還記得它不能少的事實。在英語中,整數稱為整數。它的原始型別被稱為縮寫 int。有一個正規整數——int。有短版,短版,長版,長版。相應地,int佔用32位元(4位元組)。短版本小 2 倍 - 16 位元(2 位元組),長版大兩倍,即 64 位元(8 位元組)。所以一個int最多可以儲存20億、1億左右的數字。而 long 最多可以儲存約 9 千萬億(一個好詞)。還記得一個老笑話,新手程式設計師認為千字節有 1000 個字節,而成熟的程式設計師認為一公斤有 1024 克,我們可以這樣理解:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
順便說一句,細心的讀者可能會注意到,圖中只有 7 種類型。8 原始型別是boolean。boolean 是一種布林資料類型,只有兩個值:true 和 false。但問題來了——它的尺寸是多少?Java虛擬機器規格和「2.3.4.布林類型」一節將回答我們:
Java:位元和位元組 - 18
也就是說,布林值與 int 的數量相同。如果我們宣告一個布林數組,那麼該數組的每個元素將佔用1個位元組。這些真是奇蹟:)

結論

我建議您熟悉更多材料以進行鞏固: #維亞切斯拉夫
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION