Se ho la matrice:Qual è il modo più veloce per fare uno spostamento a destra circolare bit su un array di byte
{01101111,11110000,00001111} // {111, 240, 15}
Il risultato per un turno di 1 bit è:
{10110111,11111000,00000111} // {183, 248, 7}
La dimensione dell'array non è fisso e lo spostamento sarà compreso tra 1 e 7 inclusi. Attualmente ho il seguente codice (che funziona bene):
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;
}
}
Esiste un modo più rapido per raggiungere questo rispetto al mio attuale approccio?
Penso che raggruppare in 'long's per primo sarebbe utile per le prestazioni. –
Se questo è per la grafica, un'altra opzione a cui pensare è di usare un formato codificato run-length. Quindi lo spostamento non dovrà cambiare tutte le lunghezze della corsa nel mezzo della linea. – BitBank
'long' potrebbe migliorare le prestazioni, ma varierà da macchina a macchina. (A volte 'int' sarà migliore.) –