编辑:此问题不重复。重点是使用掩码和位移来解决问题。
我有一个可怕的编程老师,介绍概念而不解释它们或提供理解它们的材料,他也是傲慢和对抗性的,也是寻求帮助的。
很自然地,我在没有任何指导的情况下坚持另一个问题。
给定一个整数变量x,编写Java代码以分别提取和显示该整数的四个字节中的每一个作为8位值。
我应该使用屏蔽和位移操作来回答这个问题。我知道屏蔽意味着“打开或关闭”位,我知道整数有32位或4位字节。但是这些信息并没有帮助我回答这个问题。我不一定要求整个解决方案,但任何帮助将不胜感激。
答案 0 :(得分:1)
您可以使用ByteBuffer
int myInt = 123;
byte[] bytes = ByteBuffer.allocate(4).putInt(myInt).array();
然后你可以用它做任何你想做的事。如果你想要所有的比特,你可以这样做:
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 8; j++)
{
if(bytes[i] & (1 << j))
{
System.out.print("1");
}
else
{
System.out.print("0");
}
}
System.out.print(" ");
}
我没有测试过这段代码,因为我在这台PC上没有Java,但如果它不起作用,请告诉我。然而,这可以让你了解必须做些什么。
答案 1 :(得分:1)
使用掩码并移位以从整数变量i
中提取字节,
从最重要(最高)到最少的字节是:
byte b3 = (byte)((i>>24));
byte b2 = (byte)((i>>16)&255);
byte b1 = (byte)((i>>8)&255);
byte b0 = (byte)((i)&255);
out.println("The bytes are " + b3 + ", " + b2 + ", " + b1 + ", " + b0);
答案 2 :(得分:1)
掩蔽不是“打开”或“关闭”。这是一种仅从您正在使用的变量中提取所需位的方法。假设你有二进制数10011011,你想要最右边4位的值。要做到这一点,你需要构建另一个相同长度的二进制数,其中你不想要的地方有0,你所在的地方有1。因此,我们的二进制数是00001111.然后你将它们按位和它们一起:
1 & 0 = 0
0 & 0 = 0
0 & 0 = 0
1 & 0 = 0
1 & 1 = 1
0 & 1 = 0
1 & 1 = 1
1 & 1 = 1
在java中,使用十六进制而不是二进制,因为java没有二进制文字,这看起来像
int result = 0x9B & 0x0F;
//result is 0xB (or 11 in decimal)
比特移动正是听起来的样子。如果你有10011111并且将它向右移动2位你得到00100111.在java中,2的位移看起来像
int result = 0x9B >> 2;
对于您的计划,我们的想法是:
答案 3 :(得分:0)
首先,您必须了解按位运算符和运算。 (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)
布尔逻辑表明x&amp; 1 = x和x&amp; 0 = 0。
知道了这一点,我们可以创建一个掩码,比如8位数的最低4位:11001101&amp; 00001111 = 1101(205&amp; 0x0f = 13)。 (我们忽略了前4个零,我们得到了4位)
如果我们需要最重要的位,该怎么办? 我们应用相同的想法,但现在掩码将根据我们需要的位改变:11001101&amp; 11110000 = 11000000(205&amp; 0xf0 = 192)
哎呀...我们得到了4个零。 你怎么能摆脱那个?向右移动4个位置。 所以11000000&gt;&gt; 4 = 1100(最重要的4位)我希望这个例子可以帮助您更好地理解按位操作。
一个简单的解决方案可能是
bit0 = (x & 0xff000000) >> 24;
bit1 = (x & 0x00ff0000) >> 16;
bit2 = (x & 0x0000ff00) >> 8;
bit3 = (x & 0x000000ff);
(bit0是MSB)。