Converting Little Endian to Big Endian

Since a great part of writing software is about reusing existing solutions, the first thing should always be a look into the documentation for your language/library.

reverse = Integer.reverseBytes(x);

I don’t know how efficient this function is, but for toggling lots of numbers, a ByteBuffer should offer decent performance.

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

...

int[] myArray = aFountOfIntegers();
ByteBuffer buffer = ByteBuffer.allocate(myArray.length*Integer.BYTES);

buffer.order(ByteOrder.LITTLE_ENDIAN);
for (int x:myArray) buffer.putInt(x);

buffer.order(ByteOrder.BIG_ENDIAN);
buffer.rewind();
int i=0;
for (int x:myArray) myArray[i++] = buffer.getInt(x);

As eversor pointed out in the comments, ByteBuffer.putInt() is an optional method, and may not be available on all Java implementations.

The DIY Approach

Stacker’s answer is pretty neat, but it is possible to improve upon it.

   reversed = (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;

We can get rid of the parentheses by adapting the bitmasks. E. g., (a & 0xFF)<<8 is equivalent to a<<8 & 0xFF00. The rightmost parentheses were not necessary anyway.

   reversed = i<<24 & 0xff000000 | i<<8 & 0xff0000 | i>>8 & 0xff00 | i>>24 & 0xff;

Since the left shift shifts in zero bits, the first mask is redundant. We can get rid of the rightmost mask by using the logical shift operator, which shifts in only zero bits.

   reversed = i<<24 | i>>8 & 0xff00 | i<<8 & 0xff0000 | i>>>24;

Operator precedence here, the gritty details on shift operators are in the Java Language Specification

Leave a Comment