Esiste un modo per eseguire uno spostamento di bit circolare in C#?
-
09-06-2019 - |
Domanda
So che quanto segue è vero
int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010
Ma se ti sposti troppo, i pezzi cadono alla fine.Dove ciò accade dipende dalla dimensione del numero intero con cui stai lavorando.
C'è un modo per eseguire uno spostamento in modo che i bit ruotino dall'altra parte?Sto cercando una singola operazione, non un ciclo for.
Soluzione
Se conosci la dimensione del testo, potresti fare qualcosa del tipo:
uint i = 17;
uint j = i << 1 | i >> 31;
...che eseguirebbe uno spostamento circolare di un valore a 32 bit.
Come generalizzazione allo spostamento circolare a sinistra di n bit, su una variabile b bit:
/*some unsigned numeric type*/ input = 17;
var result = input << n | input >> (b - n);
@Il commento, sembra che C# tratti diversamente il bit più alto dei valori con segno.Ho trovato alcune informazioni a riguardo Qui.Ho anche cambiato l'esempio per utilizzare un uint.
Altri suggerimenti
Un anno fa ho dovuto implementare MD4 per la mia tesi di laurea.Ecco la mia implementazione dello spostamento di bit circolare utilizzando un UInt32.
private UInt32 RotateLeft(UInt32 x, Byte n)
{
return UInt32((x << n) | (x >> (32 - n)));
}
Proprio come riferimento su come farlo, queste due funzioni funzionano perfettamente per ruotare i bit di 1/2 parola:
static public uint ShiftRight(uint z_value, int z_shift)
{
return ((z_value >> z_shift) | (z_value << (16 - z_shift))) & 0x0000FFFF;
}
static public uint ShiftLeft(uint z_value, int z_shift)
{
return ((z_value << z_shift) | (z_value >> (16 - z_shift))) & 0x0000FFFF;
}
Sarebbe facile estenderlo per qualsiasi dimensione.
Devo ammettere che ho appena cercato "C# bit rot" e ho trovato un file collegamento a una pagina con una classe Java che potrebbe essere facilmente adattata a C#
L'ho trovato anche in Google Book che è una funzione C++ con un comportamento simile
L'applicazione più famosa è la soluzione del problema di Giuseppe Flavio (come discusso in Matematica concreta, vedi http://oeis.org/A006257).Questo è fondamentalmente un puzzle senza applicazioni ovvie.In questo video, ho dimostrato le connessioni tra il problema di Giuseppe Flavio del secondo ordine e gli alberi bilanciati completi.Non è ancora un'applicazione, ma si sta muovendo leggermente nella giusta direzione.