Поскольку большая часть написания программного обеспечения связана с повторным использованием существующих решений, первым делом всегда следует заглядывать в документацию по вашему языку / библиотеке.
reverse = Integer.reverseBytes(x);
Я не знаю, насколько эффективна эта функция, но для переключения большого числа цифр ByteBuffer
должен обеспечивать приличную производительность.
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);
Как отметил eversor в комментариях, ByteBuffer.putInt()
является необязательным методом и может быть доступен не во всех реализациях Java.
Подход DIY
Ответ Укладчика довольно аккуратный, но его можно улучшить.
reversed = (i&0xff)<<24 | (i&0xff00)<<8 | (i&0xff0000)>>8 | (i>>24)&0xff;
Мы можем избавиться от скобок, адаптируя битовые маски. Например, (a & 0xFF)<<8
эквивалентно a<<8 & 0xFF00
. Правые скобки все равно не нужны.
reversed = i<<24 & 0xff000000 | i<<8 & 0xff0000 | i>>8 & 0xff00 | i>>24 & 0xff;
Поскольку сдвиг влево сдвигается в нулевые биты, первая маска является избыточной. Мы можем избавиться от самой правой маски, используя оператор логического сдвига, который сдвигает только нулевые биты.
reversed = i<<24 | i>>8 & 0xff00 | i<<8 & 0xff0000 | i>>>24;
Приоритет оператора здесь, мельчайшие подробности об операторах сдвига находятся в Спецификации языка Java