如何分别提取和显示整数的四个字节中的每一个作为8位值

时间:2016-03-01 19:17:59

标签: java

编辑:此问题不重复。重点是使用掩码和位移来解决问题。

我有一个可怕的编程老师,介绍概念而不解释它们或提供理解它们的材料,他也是傲慢和对抗性的,也是寻求帮助的。

很自然地,我在没有任何指导的情况下坚持另一个问题。

  

给定一个整数变量x,编写Java代码以分别提取和显示该整数的四个字节中的每一个作为8位值。

我应该使用屏蔽和位移操作来回答这个问题。我知道屏蔽意味着“打开或关闭”位,我知道整数有32位或4位字节。但是这些信息并没有帮助我回答这个问题。我不一定要求整个解决方案,但任何帮助将不胜感激。

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;

对于您的计划,我们的想法是:

  1. 屏蔽整数的最右边字节
  2. 将整数右移8位
  3. 再重复三次

答案 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)。