[英]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);
}
}
幾個問題:
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
不是“二進制表示”。 或者更准確地說:它不比num1
, num2
, num3
和num4
更多或更少二進制:內部所有數字(和字符,布爾值......)都以二進制形式存儲。
(*)注意,如果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的倍數。
所以你基本上只添加零字節,這當然會增加值。 你接下來要做的是| 他們,有點或。 這意味着兩個位域被修改,使得如果輸入值中的至少一個作為1,則結果在一個位置處具有1。 由於您的移位整數在后面只包含零,因此按位或者只是將值放在此位置。 例如:
(0x01 << 8) | 0x02
0x01 << 8
將產生0x0100
。 現在你只需用02替換最后一個00,因為你或他們: 0x0102
如果要重新創建原始int,則必須屏蔽int表示的部分(這很容易,因為部件在您的示例中不重疊)然后將其移回。
例如,說你產生了0x010203並且想要只有0x02。 你現在必須掩蓋它將它移回0x010203 >> 8,這將把02放在最后一部分。 現在只需屏蔽最后一部分0x0102 && 0xFF。 這會將除最后8位之外的所有位設置為零
1 * 2^24 + 2 * 2^16 + 3 * 2^8 + 4 = 16909060
num1 = nirbinary >> 24
獲得num1。 (i >> 24)&0xff
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.