Si tengo la matriz:¿Cuál es la manera más rápida de hacer un desplazamiento de bits circular recto en una matriz de bytes
{01101111,11110000,00001111} // {111, 240, 15}
El resultado de un cambio de 1 bit es:
{10110111,11111000,00000111} // {183, 248, 7}
El tamaño de la matriz no es fijo, y el cambio será de 1 a 7 inclusive. Actualmente tengo el siguiente código (que funciona bien):
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;
}
}
¿Hay una forma más rápida de lograr esto que mi enfoque actual?
Creo que agrupar en 'long's primero sería beneficioso para el rendimiento. –
Si esto es para gráficos, otra opción para pensar es usar un formato codificado de longitud de ejecución. Entonces el cambio no tendrá que cambiar todas las longitudes de carrera en el medio de la línea. – BitBank
'long' podría mejorar el rendimiento, pero variará de una máquina a otra. (Algunas veces 'int' será mejor). –