Devo implementare il più veloce spostamento di bit di sinistra di un array di 16 byte in JavaCard.Spostamento veloce di bit di un array di byte - Sottochiavi CMAC
Ho provato questo codice:
private static final void rotateLeft(final byte[] output, final byte[] input) {
short carry = 0;
short i = (short) 16;
do {
--i;
carry = (short)((input[i] << 1) | carry);
output[i] = (byte)carry;
carry = (short)((carry >> 8) & 1);
} while (i > 0);
}
Delle idee come migliorare la performace? Stavo pensando ad alcuni Util.getShort(...)
e Util.setShort(...)
magia, ma non sono riuscito a farlo funzionare più velocemente rispetto all'implementazione di cui sopra.
Questa è una parte del calcolo delle sottochiavi CMAC e purtroppo viene eseguita abbastanza spesso. Nel caso in cui si conosca un modo più veloce per calcolare le sottochiavi CMAC (entrambe le sottochiavi in un ciclo o qualcosa del genere), per favore, fammi sapere.
Raccolgo che JavaCard è interpeted? In tal caso, mi raccomando di dare un'occhiata al codice byte generato e ottimizzare con le istruzioni disponibili in mente. Ad esempio, sospetto che gli inte siano preferibili ai cortometraggi e che lo srotolamento del loop potrebbe farti guadagnare alcuni cicli. Oltre a ciò, sospetto che si stia facendo più di una singola operazione aritmetica di precisione estesa, quindi è probabilmente consigliabile passare a un intero più ampio in anticipo per un'elaborazione più rapida e convertire la parte posteriore di un array a 8 bit alla fine. – doynax
@doynax non c'è 'int' o' long' in JavaCard ... 'byte' e' short' è tutto ciò che hai. – vojta
Mi dispiace, suona come un ambiente particolarmente paralizzante con cui lavorare. Il mio punto rimane comunque, tenere d'occhio il codice byte generato per assicurare che il compilatore non decida di generare istruzioni 'i2s 'non necessarie sui risultati intermedi a breve di int-ma-not-really. – doynax