the_prole
the_prole

Reputation: 8945

How to extract and display each of the four bytes of an integer individually as 8-bit values

edit: This question is not a duplicate. The whole point is to solve the question using masks and bit shifts.

I have a terrible programming teacher that introduces concepts without explaining them or providing material to understand them, and he's to arrogant and confrontational too seek help from.

So naturally, I'm stuck on yet another question without any guidance.

Given an integer variable x, write Java code to extract and display each of the four bytes of that integer individually as 8-bit values.

I'm supposed to use masking and bit shift operations to answer this question. I understand that masking means turning bits "on or off" and I understand that an integer has 32 bits or 4 bytes. But that information doesn't help me answer the question. I'm not necessarily asking for the entire solution, but any help would be appreciated.

Upvotes: 0

Views: 2377

Answers (4)

spectacularbob
spectacularbob

Reputation: 3218

Masking isn't quite turning bits "on" or "off". It is a way to extract only the bits you want from the variable you are using. Lets say that you have the binary number 10011011 and you want the value of the rightmost 4 bits. To do this, you construct another binary number of the same length where there are 0's in the places that you don't want and 1's in the places that you do. Therefore, our binary number is 00001111. You then bitwise AND them together:

1 & 0 = 0
0 & 0 = 0
0 & 0 = 0
1 & 0 = 0
1 & 1 = 1
0 & 1 = 0
1 & 1 = 1
1 & 1 = 1

In java, using hex instead of binary since java doesn't have binary literals, this looks like

int result = 0x9B & 0x0F;
//result is 0xB (or 11 in decimal)

Bit shifting is just what it sounds like. If you have 10011111 and shift it right 2 bits you get 00100111. In java a bit shift of 2 looks like

int result = 0x9B >> 2;

For your program the idea is this:

  1. Mask the rightmost byte of your integer
  2. Shift integer right 8 bits
  3. Repeat three more times

Upvotes: 1

Virgil Litan
Virgil Litan

Reputation: 31

Firstly you have to understand bitwise operators and operations. ( https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html )

Boolean logic states that x & 1 = x and x & 0 = 0.

Knowing this we can create a mask for, lets say the least significant 4 bits of an 8 bit number: 11001101 & 00001111 = 1101 (205 & 0x0f = 13). (we ignore the first 4 zeros and we got our 4 bits)

What if we need the most significant bits? we apply the same idea, but now the mask will change, according to the bits we need: 11001101 & 11110000 = 11000000 (205 & 0xf0 = 192)

whoops... we got 4 zeros. How can you get rid of that? Shifting to the right with 4 positions. so 11000000 >> 4 = 1100 (most significant 4 bits)

I hope this example will help you to get a better understanding of bitwise operations.

One simple solution could be

bit0 = (x & 0xff000000) >> 24; bit1 = (x & 0x00ff0000) >> 16; bit2 = (x & 0x0000ff00) >> 8; bit3 = (x & 0x000000ff);

(bit0 is MSB).

Upvotes: 1

Matt Jordan
Matt Jordan

Reputation: 2181

Using masks and shifting to extract bytes from an integer variable i,

The bytes from most significant (highest) to least are:

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);

Upvotes: 2

JRsz
JRsz

Reputation: 2941

You could use a ByteBuffer

int myInt = 123;
byte[] bytes = ByteBuffer.allocate(4).putInt(myInt).array();

Then you can do whatever you want with it. If you want all bits you could do something like this:

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(" ");
}

I have not tested this code because I do not have Java on this PC, but if it does not work let me know. However this sould give you a ruff idea of what has to be done.

Upvotes: 1

Related Questions