簡體   English   中英

Java中的二進制表示

[英]Binary representation in Java

我發現很難理解並使用java中的二進制表示:

在用戶Jon Skeet的幫助下,我明白應該以這種方式構建二進制表示。

這是一個代碼示例:

public class chack {

public static void main(String[] args) {
    int num2=2;
    int num3=3;
    int num4=4;
    int num1=1;
    int nirbinary = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4;
    System.out.println(nirbinary);
    String nir=  Integer.toBinaryString(nirbinary);
    System.out.println(nir);
    }
}

幾個問題:

  1. 如何從已經在此二進制文件中的int返回num1(例如)
  2. 為什么會16909060當我打印nirbinary -這是什么主張? 如何從已經處於此二進制表示形式的int中獲取num1(例如)?

謝謝

我不完全確定你缺少什么,所以我將解釋如何在java中來回轉換整數到二進制字符串。

您可以從整數中獲取二進制字符串,如下所示:

int i = 1234;
String binString = Integer.toBinaryString(i);

你可以用這種方式將字符串轉換回整數:

int iNew = Integer.parseInt(binString, 2);

注意Integer.parseInt()的第二個參數是數字的期望基數。 2是二進制,8是八進制,10是十進制,等等。

16909060代表數字16909060。

它是(1 * 2 24 )+(2 * 2 16 )+(3 * 2 8 )+ 4

要讓num1退出,只需右移結果與左移相同的數量並屏蔽掉其他字節(對於num1 (*)並非總是必需,但對於其他字節):

int num1 = nirbinary >> 24 & 0xFF;
int num2 = nirbinary >> 16 & 0xFF;
int num3 = nirbinary >> 8 & 0xFF;
int num4 = nirbinary & 0xFF;

請注意, nirbinary不是“二進制表示”。 或者更准確地說:它不比num1num2num3num4更多或更少二進制:內部所有數字(和字符,布爾值......)都以二進制形式存儲。

(*)注意,如果num1為> 127,那么你要么需要使用>>>做右移使用& 0xFF ,以確保正確的值將被恢復。 >>>>>之間的區別是在值的“左”側插入的“新”位:使用>>它們將取決於最高值位(稱為符號擴展)和>>>他們永遠是0。

這里不需要只依賴於二進制或任何其他格式...一個靈活的內置函數可用於打印你想要的程序格式..

Integer.toString(int,representation);

Integer.toString(100,8)   // prints 144 --octal representation

Integer.toString(100,2)  // prints 1100100 --binary representation

Integer.toString(100,16) //prints 64  --Hex representation

Integer.toString(100,5) // prints 400  --Base 5

每個int都是一個數字,它不是二進制,十六進制或十進制,它只是一個數字。 聲明(num1 << 24) | (num2 << 16) | (num3 << 8) | num4; (num1 << 24) | (num2 << 16) | (num3 << 8) | num4; 是一個二進制操作4 int s到另一個int。 它不會將nirbinary的表示形式nirbinary為二進制,因為nirbinary沒有表示,因為(再次)它只是一個數字。

Integer.toBinaryString(nirbinary)返回的二進制表示nirbinary這意味着“如何將nibinary看起來像在鹼-2”。

如果你有一個字符串,它是一個數字的二進制表示,你可以使用Integer.parseint(yourbinaryrepresentation, yourbase);獲得它的值Integer.parseint(yourbinaryrepresentation, yourbase); 例如 - Integer.parseint(nir, 2);

另一件事:

你不能總是從nirbinary返回一個數字,因為你執行了一些不可逆的操作,例如:

int i1 = 5;   //binary 0101
int i2 = 4;   //binary 0100
int i3 = i1 | i2;  //binary 0101

你不能識別每個變量(I1,I2),因為他們有一個共同的一點,i3的本來的結果or對其他兩個數字:

int i1 = 1;   //binary 0101
int i2 = 4;   //binary 0100
int i3 = i1 | i2;  //binary 0101

在您的情況下, 如果每個數字小於256,您可以通過以下操作將其反轉:

int myoldnumber = (nirbinary >> previousShift) & 0xff;

例如,要檢索num1您可以執行以下操作:

int retrievedNum1 = (nirbinary >> 24) & 0xff;

當使用位移和整數時,我建議你用十六進制數來思考,這通常會讓生活變得更容易。 請記住,8位表示1字節,1字節覆蓋從0x00到0xFF的十六進制范圍

由於num1到num4小於10,它們的十進制表示等於它們的十六進制表示,即1 = 0x01,2 = 0x02等。正如我告訴你的:1字節是8位。 在您的位移操作中,您總是移動8的倍數。

  • 所以0x01 << 8 => 0x0100
  • 0x01 << 16 => 0x010000
  • 等等

所以你基本上只添加零字節,這當然會增加值。 你接下來要做的是| 他們,有點或。 這意味着兩個位域被修改,使得如果輸入值中的至少一個作為1,則結果在一個位置處具有1。 由於您的移位整數在后面只包含零,因此按位或者只是將值放在此位置。 例如:

(0x01 << 8) | 0x02

0x01 << 8將產生0x0100 現在你只需用02替換最后一個00,因為你或他們: 0x0102

如果要重新創建原始int,則必須屏蔽int表示的部分(這很容易,因為部件在您的示例中不重疊)然后將其移回。

例如,說你產生了0x010203並且想要只有0x02。 你現在必須掩蓋它將它移回0x010203 >> 8,這將把02放在最后一部分。 現在只需屏蔽最后一部分0x0102 && 0xFF。 這會將除最后8位之外的所有位設置為零

  1. 它基本上是1 * 2^24 + 2 * 2^16 + 3 * 2^8 + 4 = 16909060
  2. 你可以通過num1 = nirbinary >> 24獲得num1。
  1. 你有什么期望呢?
  2. 要從int i中獲取最重要的字節:

(i >> 24)&0xff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM