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.

È stato utile?

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.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top