Como explica
LordTech en el documento Leetasm.log, shifting significa
hacer un "corrimiento" de dígitos en una cierta
dirección y agregar un 0 en el espacio vacío.
Por
ejemplo el numero 125 (en base 10 o decimal que es lo
mismo) si le hacemos un shift a la izquierda se corren
todos los dígitos a la izquierda y queda 125_ y en el
espacio vacío se agrega un 0 quedando 1250, esto se
resume en algo así:
_125 -> 125_ ->
1250
Así que luego de haber corrido los dígitos a
la izquierda la operación matemática que se hizo es un
Multiplicación:
125 * 10 = 1250
Se usa la
multiplicación no para mover todo a la izquierda, sino
que hacemos shift para multiplicar, la razón es que el
dígito de la izquierda tiene un valor 10x veces mayor
que los otros, así en 125:
el 5 vale 5 unos
el 2 vale 2 diez
el 1 vale 1
cien
entonces al hacer shifting
estamos "moviendo" los valores de cada dígito a 10x de
lo que valen, y claro, por ahora es con base
10.
Ahora la idea es base 2, así que en vez de
multiplicar por 10, se multiplica por 2.
Para hacer shifting con base 2, se pueden
hacer 2 cosas; pasar el dígito a binario o usar
"ecuaciones".
Con método binario, el caso
anterior de 125 queda:
1111101 bin = 125
dec
hacemos shifting izquierdo para
multiplicar
11111010 bin = 250 dec ->todo se
desplaza a la izquierda para
MULTIPLICAR
1111101 bin = 125
dec
hacemos shifting derecho para hacer una división
ENTERA
0111110 bin = 62 dec
(125/2=62.5)
Otra forma de entender shifting, es
como explica LordTech en el Log, y es con Álgebra, por
ejemplo si tenemos el número 12 y necesitamos llegar a
este numero por medio de shifting con base 2, entonces
se debe multiplicar el 2 hasta llegar el número.
Uno
puede hacer entonces 2x2=4, 2x2x2=8, 2x2x2x2=16,... pero
esto no nos da 12.
Sabemos que 12 = 8 +
4
Agreguemos Álgebra al asunto, usamos la variable X,
lo que nos da:
12*X = 8*X +4*X
si tomamos X,
la multiplicamos 8 y luego le agregamos 4 multiplicado
por X nos da 12 multiplicado por X.
12*2 = 8*2
+ 4*2
La idea es dejar el número como una
representación de otros números que sean divisibles por
2.
El 21:
21 = 16 + 4 + 1
21*X = (2^4)*X +
(2^2)*X + (2^0)*X -> X es 2 si el Shifting es
en base 2
21*2 = (2^4)*2 + (2^2)*2 + (2^0)*2
42
= 2^5 + 2^3
+ 2
42 = 32
+ 8 +
2
Esta forma con álgebra, personalmente la
encuentro un poco compleja explicar simplemente que los
bits se corren.
También tienes que la SNES provee
las instrucciones:
ASL = Arithmetic Shift Left
-> multiplica el acumulador por 2
LSR =
Logical Shift Right -> divide el
acumulador por 2
En resumen, el shifting se usa
para distintas cosas, por ejemplo para darle SOMBRA a
una TILE
Por ejemplo si tengo una Tile A de 2bpp, de
cierto juego que se ve en la imagen.

Los bytes de
esa tile
son:
$00,$00,$00,$00,$00,$00,$7C,$78,$FE,$CC,$EE,$CC,$EE,$CC,$FE,$FC,$FE,$CC,$EE,$CC,$EE,$CC,$CC,$22,$00,$00,$00,$00,$00,$00,$00,$00
Si
la dividimos en planos:
Plano
1
00000000 00
00000000 00
00000000 00
01111100 7C
-> sombra de
A
11111110 FE
11101110 EE
11101110 EE
11111110 FE
Plano
2
00000000 00
00000000 00
00000000 00
01111000 78
-> tile
A
11001100 CC
11001100 CC
11001100 CC
11111100 FC
La
SNES pinta primero la tile A, luego usando un Shifting a
la DERECHA de cada byte de la tile, forma la
SOMBRA
01111000 = 78 ->
de Plano 2
00111100
=> Shifting a la DERECHA, so corren bytes a la
derecha
------------- OR
=> se hace un OR
01111100 =
7C ->se consigue byte de Plano
1
Haciendo Shifting a cada fila de la tile (cada
fila es un byte) se consigue la fila Sombra de ese
byte.