【问题标题】:Binary representation in JavaJava中的二进制表示
【发布时间】:2016-10-21 22:30:46
【问题描述】:

我发现在 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. 为什么当我打印nirbinary 时得到16909060 - 它代表什么? 如何从已经在此二进制文件中的 int 中获取 num1(例如) 代表?

谢谢

【问题讨论】:

  • 你得到的数字是2^24 + 2*2^16 + 3*2^8 + 4吗?

标签: java binary


【解决方案1】:

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

你可以像这样从一个整数中得到一个二进制字符串:

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

您可以通过这种方式将字符串转换回整数:

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

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

【讨论】:

  • 感谢您的评论。我不想使用字符串。我只想使用这种二进制表示,我更感兴趣的是如何从这个 int nirbinary 中取回 num1。
  • 啊,好吧。那么其他答案可能会更有帮助:D
【解决方案2】:

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 > 127,那么您要么 需要使用&gt;&gt;&gt; 进行右移 使用@987654333 @ 以确保恢复正确的值。 &gt;&gt;&gt;&gt;&gt; 之间的区别在于插入值“左侧”的“新”位:&gt;&gt; 取决于最高值位(称为符号扩展)和 @ 987654337@ 他们永远是 0。

【讨论】:

  • 感谢您的评论。你能解释一下写&amp; 0xFF是什么意思吗?这和只写`num1 = nirbinary >> 24`有什么区别,正如这里所建议的那样?
  • @Nir: 对于num1 没有区别(因为num1 被“存储”在nirbnary 的最高8 位中)。但是对于num2num3num4,它可以删除存储其他数字的较高位(即,如果您执行了nirbinary &gt;&gt; 16,您将得到一些包含num2 在最低8 位中的值和 num1 在接下来的 8 位中)。 &amp; 0xFF 将除最低 8 个位之外的所有位设置为零,从而有效地删除了其他值。
【解决方案3】:

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

Integer.toBinaryString(nirbinary) 返回nirbinary 的二进制表示形式,意思是“二元在base-2 中的样子”。

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

【讨论】:

    【解决方案4】:

    这里不需要只依赖二进制或任何其他格式... 提供一种灵活的内置功能 这会在程序中打印您想要的任何格式..

    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】:

      在使用位移位和整数时,我建议您使用十六进制数字,这通常会使生活变得更轻松。请记住,8 位代表 1 个字节,1 个字节涵盖从 0x00 到 0xFF 的十六进制范围

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

      • 所以 0x01 0x0100
      • 0x01 0x010000

      所以你基本上只添加零字节,这当然增加了价值。 你接下来要做的是|他们,按位或。这意味着如果至少有一个输入值为 1,则以这样的方式修改两个位域,即结果在一个地方为 1。由于您的移位整数在后面仅包含零,因此按位或仅将值放在此位置。 例如:

      (0x01 << 8) | 0x02
      

      0x01 &lt;&lt; 8 将产生0x0100。现在您只需将最后的 00 替换为 02,因为您或他们:0x0102

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

      例如 假设您生产了 0x010203,并且只想拥有 0x02。您现在必须将其掩码移回 0x010203 >> 8 ,这会将 02 放在最后一部分。现在简单地屏蔽这最后一部分 0x0102 && 0xFF。这会将除最后 8 位之外的所有位设置为零

      【讨论】:

        【解决方案6】:
        1. 基本上是1 * 2^24 + 2 * 2^16 + 3 * 2^8 + 4 = 16909060
        2. 你可以通过num1 = nirbinary &gt;&gt; 24获取num1。

        【讨论】:

          【解决方案7】:
          1. 您的期望是什么?
          2. 从 int i 中获取最高有效字节:

          (i >> 24) & 0xff

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-24
            • 2021-10-06
            • 1970-01-01
            • 2011-04-17
            • 2021-12-21
            • 2018-04-10
            • 1970-01-01
            相关资源
            最近更新 更多