Java中的二进制表示

时间:2011-04-08 09:54:53

标签: java binary

我发现很难理解并使用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(例如) 代表性?
  3. 谢谢

7 个答案:

答案 0 :(得分:16)

我不完全确定你缺少什么,所以我将解释如何在java中来回转换整数到二进制字符串。

您可以从如下的整数中获取二进制字符串:

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

你可以用这种方式将字符串转换回整数:

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

注意Integer.parseInt()的第二个参数是数字的理想基数。 2是二进制,8是八进制,10是十进制等等。

答案 1 :(得分:12)

16909060代表号码16909060。

(1 * 224) + (2 * 216) + (3 * 28) + 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是&gt; 127,那么你要么需要使用>>>进行右移使用& 0xFF以确保正确的值是恢复。 >>>>>之间的差异是在值的“左侧”插入的“新”位:使用>>它们将取决于最高值位(称为符号) -extension)和>>>,它们将始终为0。

答案 2 :(得分:2)

每个int都是一个数字,它不是二进制,十六进制或十进制,它只是一个数字。语句(num1 << 24) | (num2 << 16) | (num3 << 8) | num4;是将4 int二进制操作到另一个int中。它不会将nirbinary的表示更改为二进制,因为nirbinary没有表示,因为(再次)它只是一个数字。

Integer.toBinaryString(nirbinary)返回nirbinary的二进制表示,表示“在base-2中nibinary如何”。

如果您的字符串是数字的二进制表示形式,那么您可以使用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;

答案 3 :(得分:2)

当使用位移和整数时,我建议你用十六进制数来思考,这通常会让生活变得更容易。请记住,8位代表1个字节,1个字节覆盖从0x00到0xFF的十六进制范围

由于num1到num4小于10,因此它们的十进制表示等于它们的十六进制表示,即1 = 0x01,2 = 0x02等。 正如我告诉你的:1字节是8位。在您的位移操作中,您总是移动8的倍数。

  • 所以0x01&lt;&lt; 8 =&gt; 0×0100
  • 0x01&lt;&lt; 16 =&gt; 0x010000

所以你基本上只添加零字节,这当然会增加值。 你接下来要做的是|他们,有点或。这意味着两个位域被修改,使得如果输入值中的至少一个作为1,则结果在一个位置处具有1。由于您的移位整数在后面只包含零,因此按位或者只是将值放在此位置。 E.g:

(0x01 << 8) | 0x02

0x01 << 8将生成0x0100。现在您只需将02替换为02,因为您或他们:0x0102

如果要重新创建原始int,则必须屏蔽int表示的部分(这很容易,因为部件在您的示例中不重叠)然后将其移回。

E.g。 假设你产生了0x010203并希望只有0x02。你现在必须掩盖它将它移回0x010203&gt;&gt; 8将02放在最后一部分。现在简单地掩盖最后一部分0x0102&amp;&amp; 0xFF的。这会将除最后8位之外的所有位设置为零

答案 4 :(得分:2)

这里不需要仅依赖于二进制或任何其他格式...... 一个灵活的内置功能可用 这会在您的程序中打印您想要的任何格式..

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

答案 5 :(得分:0)

  1. 基本上是1 * 2^24 + 2 * 2^16 + 3 * 2^8 + 4 = 16909060
  2. 您可以通过执行num1 = nirbinary >> 24来获取num1。

答案 6 :(得分:0)

  1. 你有什么期望呢?
  2. 从int i:
  3. 获取最重要的字节

    (i>&gt; 24)&amp; 0xff的