Operadores ">>" y "<<"

Bueno, la cosa es que no entiendo... Osea, el segundo me parece que si, ya que vi una explicacion, pero el primero no lo entiendo...


El segundo... <<

2 << 2

//output 8
//Ya que 2 en binario es 0010 y entonces se tiene que correr 2 bits para el costado y queda 1000, que en decimal es 8...

Por lo menos eso es lo que entendi =S


Pero el otro no lo entiendo xD...
Pues lo mismo pero al revés:

0100000 >> 2 = 0001000
por cierto cabe destacar que este operador se puede utilizar para realizar divisiones entre 2y sus múltiplos a numeros enteros a mas velocidad.

101 >>1 = 010 =2
5 >>1 = 2
5/2 = 2

tambien sirve para multiplicar.
tal como apunta el compañero saulotmalo se usa mucho para multiplicar y dividir por multipos de 2, un uso claro es la programacion de tiles de GBA y NDS x>>3(8) x<<4(16) ya que estas operaciones se usan mucho y son mas rapidas que las divisiones.

Otro uso es para hacer multiplicaciones *1000:
2^10 = 1k = 1.024 ~ 1.000
2^20 = 1m = 1.024k ~ 1.000.000
Un truquete para sustituir una división por una multiplicación más un desplazamiento:

Suponemos por ejemplo que queremos dividir entre 27:
1 / 27 = 0.037037

Multiplicamos este número por un número que sea potencia de 2, teniendo cuidado de no desbordar el dividendo con la multiplicación:
0.037037 * 512 = 18.96

Bien pues si multiplicamos cualquier número por (18 + 1) y lo dividimos entre 2048, el resultado es CASI el mismo que si lo hubiéramos dividido entre 27. Por ejemplo:
12345 / 27 = 457
(12345 * 19) / 512 = 458
Cabe destacar que la mayoría de estos trucos el compilador se los sabe y en muchas ocasiones al compilar depende de la opción con la que compiles hace uso de ellas. Aunque personalmente me suele gustar tener un poco de control sobre lo que hace...

por cierto? alguien de tarragona? en breve se estrenará mi nuevo software allí jeje.

un saludo
El >> tiene truco

Existe dos tipos de desplazamiento, el logico y el aritmetico.

Cuando el desplazamiento es hacia la izquierda (<<), ambos son equivalentes, pero cuando es hacia la derecha (>>), actuan de forma diferente : el logico es desplazar bits hacia la derecha añadiendo ceros por la izquierda, pero el aritmetico, lo que hace es replicar el bit de signo (es decir, el mas alto) para ir rellenando desde la izquierda.

Esto en C se traduce en que si la variable es con signo (un int, por ejemplo), el desplazamiento será aritmetico, pero si es sin signo, entonces si será logico.

Unos ejemplos sencillos usando variables de tamaño de un byte:

signed char a=-128;

a>>=2; En binario: 10000000b >>2 =11100000b = -32 en dec


unsigned char a=128;

a>>=2; En binario: 10000000b >>2 =00100000b = 32 en dec

Asi que ya sabes: cuidado con los desplazamientos hacia la derecha ;)
saulotmalo escribió:Cabe destacar que la mayoría de estos trucos el compilador se los sabe y en muchas ocasiones al compilar depende de la opción con la que compiles hace uso de ellas. Aunque personalmente me suele gustar tener un poco de control sobre lo que hace...

por cierto? alguien de tarragona? en breve se estrenará mi nuevo software allí jeje.

un saludo

OFFTOPIC:
yo soy de tarragona ^^
krosk escribió:OFFTOPIC:
yo soy de tarragona ^^


pues dentro de poco subete al tren turistic que van a poner por allí y verás mi app :). Es un dispositivo con pantalla táctil en windows CE bastante wapo :).
8 respuestas