Tengo lo siguiente:
int ret = 3;
ret <<= 1; // el resultado es ret = 3 << 1 = 6
ret |= 3; // el resultado es ret = 6 | 3 = 7
No entiendo las operaciones a nivel de bits ¿alguien lo explica de la forma mas cristiana posible? :wacko:
S2.
Cita de: "J_F_NASH"Tengo lo siguiente:
int ret = 3;
ret <<= 1; // el resultado es ret = 3 << 1 = 6
ret |= 3; // el resultado es ret = 6 | 3 = 7
No entiendo las operaciones a nivel de bits ¿alguien lo explica de la forma mas cristiana posible? :wacko:
S2.
3 es 0011 en base dos (con cuatro bits, un int tendría un porrón más pero serían todo ceros a la izquierda)
3 << 1 significa un desplazamiento hacia la izquierda, esto es:
0110
que curiosamente es 6 en base diez
y 6 |= 3 es la primera vez que lo veo, pero supongo que significa ret= 6 | 3 que es ret= 0110 | 0011 y como la tabla de verdad de la operación OR (la barra esa) dice:
a1 a2 F(a)
-------------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1
Entonces tienes que
0110
0011
------
0111
que es siete en base diez.
¿Me se entiende?
¡Alto y claro! (ole)
PD: por si te resulta más fácil así, piensa que cuando desplazas hacia la izquierda estás multiplicando por 2 elevado al número de bits desplazados. Así,
3 << 1 = 3 * 2^1 = 6
3 << 2 = 3 * 2^2 = 12
3 << 3 = 3 * 2^3 = 24
etc.
Y cuando desplazas a la derecha es igual , sólo que en vez de multiplicar, estás diviendo.
(ole)
Solo añadir que las operaciones de rotación de bits tienen un coste de ciclos de cpu muy bajo, y más comparado con multiplicaciones y divisiones.
Un saludo.
Añadir también que el desplazamiento a la derecha MANTIENE EL BIT DE SIGNO.
Traduciendo, que si tenemos este byte: 11110010
Si lo rotamos a la izquierda (<<), tenemos que b = 11100100
Pero si lo rotamos a la derecha (>>), tenemos que b = 1111101
El bit de signo (bit de la izquierda) se mantiene.
Me suena que con variables unsigned haría un desplazamiento lógico y no aritmético ^_^'
sync
En C desde luego no creo. Trabaja con BYTEs, WORDs, DWORDs..., "no entiende" de signos ni tipos (podemos tratar cualquier variable como nos plazca) excepto al hacer comparaciones y cosas así, se dedica a operar con zonas de memoria y punto.
El C y su libertad... :D
Me has hecho dudar y todo así que lo he comprobado. Te veo en baja forma sés ;)
int main(int argc, char* argv[])
{
unsigned int natural;
int entero;
natural = 12;
entero = 12;
printf("%i %i\n", natural, entero );
natural >>= 1;
entero >>= 1;
printf("%i %i\n", natural, entero );
natural = -12;
entero = -12;
natural >>= 1;
entero >>= 1;
printf("%i %i\n", natural, entero );
return 0;
}
12 12
6 6
2147483642 -6
sync
2147483642 = 11111111 11111111 1111111 11111010
Lo único que estás haciendo es IMPRIMIR EN PANTALLA un "unsigned". Internamente el bit de signo está ahí.
haz: entero = (int)natural;
y luego lo imprimes.
Verás un estupendo -6 :rolleyes:
Te veo en baja forma Sync.
Grosso errore:
2147483642 = 01111111 11111111 11111111 11111010
sync
Cierto, separé mal los "1" ^_^
puse:
11111111 11111111 1111111 11111010
y es:
01111111 11111111 11111111 11111010
Y el 0 de delante viene porque el desplazamiento que hace con unsigneds es lógico y no aritmético (ole)
sync
Sigue siendo aritmético, lo que pasa es que "sin signo"; por eso no lo mantiene.
mmm... ¿y por que no nos vamos a la fuente del problema?:
(código copypasteado del post de sync) :P
(http://webs.ono.com/usr040/HgH/dummy.JPG)
Según en manual del intel
shr = Shift Logical Right
sar = Shift Arithmetic Right
Por lo tanto con int's el desplazamiento es aritmético y con unisgned's es lógico.
Saludetes
eso es un dsp ? umh ¿?
¿ Como se hace para que de cada línea ver el código asm debajo ?
Citar
¿ Como se hace para que de cada línea ver el código asm debajo ?
Plantas un breakpoint en donde te interese, ejecutas y cuando la ejecución llegue al breakpoint, te vas al menú View|Debug Windows|Disassembly (aunque puedes evitarte esto y darle a Alt+8 ). Todo esto con VC6
Saludetes
Gracias. (ole) luego lo pruebo.
Es interesante se aprende asm.
:lol:
eso en debug, asm sucks
Hola
Citar
eso en debug, asm sucks
Puedes sacar tambien el ensamblador en debug. Usas la configuracion de release (o te creas una) que optimize el codigo pero que saque "debug info" (o los archivos .cod).
Viene bien para saber como genera el codigo el compilador y saber asi como optimizar mas tu codigo.. y si es menester cambiarlo por otro en ensamblador mas eficiente.
Y bueno.. eso de asm sucks.. no has programado mucho verdad? mas que nada es porque en muchas ocasiones hay que depurar codigo "marciano" y conocer el ensamblador viene como que bastante bien.
Un Saludo.