Qual è il modo più rapido per permutare casualmente (ma ripetutamente) tutti i bit all'interno di un array di byte Java? Ho provato a farlo con successo con un BitSet, ma c'è un modo più veloce? Chiaramente il ciclo for consuma la maggior parte del tempo della CPU.Il modo più veloce per permutare i bit in un array Java
Ho appena fatto un po 'di profilazione nel mio IDE e il ciclo for costituisce il 64% del tempo della CPU all'interno dell'intero metodo permute().
Per chiarire, la matrice (preRound) contiene una matrice esistente di numeri che entrano nella procedura. Voglio che i singoli bit del set di quell'array vengano mescolati in modo casuale. Questo è il motivo per P []. Contiene un elenco casuale di posizioni di bit. Ad esempio, se è impostato il bit 13 di preRound, viene trasferito al posto P [13] di postRound. Questo potrebbe essere nella posizione 20555 di postRound. Il tutto fa parte di una rete di permutazione di sostituzione, e sto cercando il modo più veloce per permutare i bit in arrivo.
Il mio codice finora ...
private byte[] permute(byte[] preRound) {
BitSet beforeBits = BitSet.valueOf(preRound);
BitSet afterBits = new BitSet(blockSize * 8);
for (int i = 0; i < blockSize * 8; i++) {
assert i != P[i];
if (beforeBits.get(i)) {
afterBits.set(P[i]);
}
}
byte[] postRound = afterBits.toByteArray();
postRound = Arrays.copyOf(postRound, blockSize); // Pad with 0s to the specified length
assert postRound.length == blockSize;
return postRound;
}
Cordiali saluti, blockSize è di circa 60.000 e P è una tabella di ricerca casuale.
generare numeri interi a 32 bit casuali fino a quando hai sufficiente per impostare in modo casuale ogni byte. – JustinDanielson
Per chiarire, vuoi permutare nel senso tecnico di una [permutazione] (http://en.wikipedia.org/wiki/Permutation)? O vuoi semplicemente dei byte casuali nell'array? Se il primo, cosa intendi per "casualmente" permutandoli? Se quest'ultimo è ['Random.nextBytes'] (http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextBytes (byte [])) cosa sei cercando? – yshavit
Che cosa è esattamente 'P'? – RealSkeptic