我发现很难理解并使用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(例如)
代表性?谢谢
答案 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
(*)< sup>,但对于其他人):
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
是&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的倍数。
所以你基本上只添加零字节,这当然会增加值。 你接下来要做的是|他们,有点或。这意味着两个位域被修改,使得如果输入值中的至少一个作为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 * 2^24 + 2 * 2^16 + 3 * 2^8 + 4 = 16909060
num1 = nirbinary >> 24
来获取num1。答案 6 :(得分:0)
(i>&gt; 24)&amp; 0xff的