Какой самый быстрый способ сделать правый битовый поворот/циклический сдвиг в массиве байтов

Если у меня есть массив:

{01101111,11110000,00001111} // {111, 240, 15}

Результат для сдвига на 1 бит:

{10110111,11111000,00000111} // {183, 248, 7}

Размер массива не фиксирован, и сдвиг будет от 1 до 7 включительно. В настоящее время у меня есть следующий код (который отлично работает):

private static void shiftBitsRight(byte[] bytes, final int rightShifts) {
   assert rightShifts >= 1 && rightShifts <= 7;

   final int leftShifts = 8 - rightShifts;

   byte previousByte = bytes[0]; // keep the byte before modification
   bytes[0] = (byte) (((bytes[0] & 0xff) >> rightShifts) | ((bytes[bytes.length - 1] & 0xff) << leftShifts));
   for (int i = 1; i < bytes.length; i++) {
      byte tmp = bytes[i];
      bytes[i] = (byte) (((bytes[i] & 0xff) >> rightShifts) | ((previousByte & 0xff) << leftShifts));
      previousByte = tmp;
   }
}

Есть ли более быстрый способ добиться этого, чем мой текущий подход?

9
задан Motasim 16 August 2019 в 10:21
поделиться