En matemàtiquescombinatòries, un desplaçament circular és l'operació de reordenar les entrades en una tupla, ja sigui movent l'entrada final a la primera posició, mentre que totes les altres entrades es mouen a la següent posició, o bé fent l'operació inversa. Un desplaçament circular és un tipus especial de permutació cíclica, que al seu torn és un tipus especial de permutació. Formalment, un desplaçament circular és una permutació σ de les n entrades de la tupla de manera que [1]
mòduln, per a totes les entrades i = 1,... , n. El resultat d'aplicar repetidament desplaçaments circulars a una tupla donada també s'anomenen desplaçaments circulars de la tupla.
Per exemple, l'aplicació repetida de desplaçaments circulars a la quatre-tuple (a, b, c, d ) dona successivament
( d, a, b, c ),
(c, d, a, b ),
(b, c, d, a ),
(a, b, c, d ) (la quatre-tuple original),
i llavors la seqüència es repeteix; per tant, aquesta quatre tuple té quatre desplaçaments circulars diferents. Tanmateix, no totes les n -tuples tenen n desplaçaments circulars diferents. Per exemple, la tupla 4 (a, b, a, b ) només té 2 desplaçaments circulars diferents. El nombre de desplaçaments circulars diferents d'una n -tupla és , on k és un divisor de n, que indica el nombre màxim de repeticions en tots els subpatrons.[2]
En la programació d'ordinadors, una rotació per bits, també coneguda com a desplaçament circular, és una operació per bits que desplaça tots els bits del seu operand. A diferència d'un desplaçament aritmètic, un desplaçament circular no conserva el bit de signe d'un nombre ni distingeix l'exponent d'un nombre de coma flotant del seu significat. A diferència d'un desplaçament lògic, les posicions de bits vacants no s'emplenen amb zeros, sinó que s'omplen amb els bits que s'han desplaçat fora de la seqüència.[3]
Implementació de desplaçament circulars
Els desplaçaments circulars s'utilitzen sovint en criptografia per tal de permutar seqüències de bits. Malauradament, molts llenguatges de programació, inclòs C, no tenen operadors ni funcions estàndard per al desplaçament circular, tot i que pràcticament tots els processadors tenen instruccions d'operació per bits (per exemple, Intel x86 té ROL i ROR). Tanmateix, alguns compiladors poden proporcionar accés a les instruccions del processador mitjançant funcions intrínseques. A més, algunes construccions del codi ANSI C estàndard poden ser optimitzades per un compilador per a la instrucció del llenguatge assemblador "rotar" a les CPU que tenen aquesta instrucció. La majoria dels compiladors C reconeixen l'idioma següent i el compilen en una única instrucció de rotació de 32 bits.[4]
Exemple
Si la seqüència de bits 0001 0111 estigués sotmesa a un desplaçament circular d'una posició de bit... (veure imatges a continuació)
a l'esquerra donaria: 0010 1110
a la dreta donaria: 1000 1011.
Si la seqüència de bits 1001 0110 estigués sotmesa a les operacions següents:
desplaçament circular a l'esquerra d'1 posició:
0010 1101
desplaçament circular a l'esquerra de 2 posicions:
0101 1010
desplaçament circular a l'esquerra de 3 posicions:
1011 0100
desplaçament circular a l'esquerra de 4 posicions:
0110 1001
desplaçament circular a l'esquerra de 5 posicions:
1101 0010
desplaçament circular a l'esquerra de 6 posicions:
1010 0101
desplaçament circular a l'esquerra de 7 posicions:
0100 1011
desplaçament circular a l'esquerra de 8 posicions: