No entiendo tampoco a que queres llegar xD. No se si a lo que apuntas es el por que rotar es dividir/multiplicar por 2, o por que se usa una AND. Voy a escribir esto y si seguis teniendo dudas espero llegar a entenderlas o que otro llegue a entender el "por que" que estas buscando.
Uno normalmente intenta llegar de un "numero" a otro, o por ahi mejor dicho de un formato a otro. Para eso sacamos provecho de la logica de las AND / OR / XOR / rotaciones, etc.
el AND no tiene comparacion matematica con nada ( No es como dividir por 2 cuando rotamos, incluso rotar puede no significar eso ) sino que lo unico que hace es respetar una tabla de verdad:
Y nosotros intentamos sacar provecho de esa tabla de verdad, vemos que lo unico que le ponga un 1 va a sobrevivir, todo lo demas se va a poner en 0. Te propongo 2 casos,
-1, obtener el valor del puerto B, los bits 1 al 5 y, que esos bits comienzen en el bit 0. Entonces voy a hacer:
PORTB 0101 0110 , Hago una AND aprovechando la tabla de verdad, esto me va a permitir quitar los bits que yo no quiero
AND 0011 1110
Igual: 0001 0110
Roto Derecha y 0000 1011 quedo mi resultado.... pero rotar a la derecha fui dividir por 2 para mi ? No, simplemente esa colecccion de bits para mi era eso, solo una coleccion de bits no era un numero.
O tal ves supongamos que es un numero y quiero llegar al multiplo de 4 anterior a ese valor, el mas cercano. 1100 1101, tengo que llegar a 1100 1100, o mejor:
de aaaa aabb deberia llegar a: aaaa aa00 , Cuales la forma mas rapida de hacer esto? Aprovecho una OR? No puedo, Podria restar "bb", pero ahora tengo otro problema y es solamente la extraccion de "bb" Lo mas simple es aplicar una AND.
-2
Ahora si supongamos tengo 120 expresado en binario: 0111 1000. Y necesito obtener el binario que sea equivalente a ese numero dividido por 2. Yo se que 60 es expresado en binario: 0011 1100 ,
Tengo que buscar una forma de llegar de un numero al otro, sumo, resto, AND, OR? no lo mas simple es rotarlo, en este caso rotarlo tuvo el mismo resultado que dividirlo por 2, pero sigue siendo una rotacion como arriba ( de una coleccion de bits ).
La explicacion de por que rotar es una division por 2 esta basada en como es la base del numero. 1*2⁶ + 1*2⁵ + 1*2⁴ + 1*2³ + 0*2² + 0*2¹ + 0*2⁰ , (dividis por 2 y es restarle un -1 a cada exponente )
Pero la idea partio de un coleccion de bits y llegar a otra.
Otra puede ser una XOR, para que usarias una XOR ?
Veamos, si yo tengo el valor A, y el B es el dato que yo le agrego, puedo ver que cuando pongo un 1 invierto el bit!. Obviamente lo puedo usar para ese caso!,
PORTB 0110 1101 , debo llegar a 1110 0100
Invertir el bit 1,3,7 los demas dejarlo asi,
Cargo en W 1000 1001 y hago una XOR, Nuevamente la idea es de llegar de una coleccion de bits a otro.
Tambien podria ser util en otra aplicacion, veo que si tengo 2 o 0 unos se hace 0, y si tengo 1 solo uno es 1 ... Esto puede ser bueno para la paridad, si es par 0, si es impar 1. Tal ves en otra tambien
Por que no use una AND y una OR? por que son menos pasos
Creo que una ves salio el tema con vos.
¿Que diferencia hay entre estos valores?
-a 1100 1101
-b 1100 1101
-c 1100 1101
-d 1100 1101
-e 1100 1101
¿ Ninguna ? ....
a para mi son es un numero sin signo ( 205 )
b para mi es un numero con signo ( -141 )
c para mi son 2 numeros, los 4 bits de arriba me indican un numero y los 4 bits de abajo otro ( 12 y 13 )
d para mi no es un numero, son los estados de un puerto
e para mi tampoco es un numero son flags que utilizo y que me indican .......
En fin.. eso puede representar cualquier cosa, es una coleccion de 1s y 0s, Si yo uso la rotacion como RRF en cualquiera, solamente en el caso de "a" va a ser
equivalente a dividirlo por 2, todo lo demas es una simple rotacion de bits (que realmente es).
Creo que todo pasa por: Tratar de llegar de una coleccion de bits a otro. ( y que se cumpla para cualquier coleccion de bits que se presente )
Estas preguntas filosoficas de Miguel