Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: J_F_NASH en 30 de Septiembre de 2003, 01:36:10 PM

Título: Operadores A Nivel De Bits
Publicado por: J_F_NASH en 30 de Septiembre de 2003, 01:36:10 PM
 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.
Título: Operadores A Nivel De Bits
Publicado por: Mars Attacks en 30 de Septiembre de 2003, 02:21:54 PM
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?
Título: Operadores A Nivel De Bits
Publicado por: BeRSeRKeR en 30 de Septiembre de 2003, 03:39:00 PM
 ¡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.
Título: Operadores A Nivel De Bits
Publicado por: MA]Mestre en 30 de Septiembre de 2003, 11:24:46 PM
  (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.
Título: Operadores A Nivel De Bits
Publicado por: sés en 01 de Octubre de 2003, 08:42:12 AM
 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.
Título: Operadores A Nivel De Bits
Publicado por: synchrnzr en 01 de Octubre de 2003, 09:18:24 AM
 Me suena que con variables unsigned haría un desplazamiento lógico y no aritmético ^_^'

sync
Título: Operadores A Nivel De Bits
Publicado por: sés en 01 de Octubre de 2003, 10:13:15 AM
 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
Título: Operadores A Nivel De Bits
Publicado por: synchrnzr en 01 de Octubre de 2003, 11:39:45 AM
 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
Título: Operadores A Nivel De Bits
Publicado por: sés en 01 de Octubre de 2003, 12:32:37 PM
 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.
Título: Operadores A Nivel De Bits
Publicado por: synchrnzr en 01 de Octubre de 2003, 12:50:11 PM
 Grosso errore:

2147483642 = 01111111 11111111 11111111 11111010

sync
Título: Operadores A Nivel De Bits
Publicado por: sés en 01 de Octubre de 2003, 12:56:57 PM
 Cierto, separé mal los "1" ^_^

puse:
11111111 11111111 1111111 11111010

y es:
01111111 11111111 11111111 11111010
Título: Operadores A Nivel De Bits
Publicado por: synchrnzr en 01 de Octubre de 2003, 01:03:03 PM
 Y el 0 de delante viene porque el desplazamiento que hace con unsigneds es lógico y no aritmético (ole)

sync
Título: Operadores A Nivel De Bits
Publicado por: sés en 01 de Octubre de 2003, 02:52:43 PM
 Sigue siendo aritmético, lo que pasa es que "sin signo"; por eso no lo mantiene.
Título: Operadores A Nivel De Bits
Publicado por: HgH en 01 de Octubre de 2003, 05:12:37 PM
 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

Título: Operadores A Nivel De Bits
Publicado por: ethernet en 02 de Octubre de 2003, 08:02:41 PM
 eso es un dsp ? umh ¿?  
Título: Operadores A Nivel De Bits
Publicado por: Degiik en 04 de Octubre de 2003, 08:22:41 PM
 ¿ Como se hace para que de cada línea ver el código asm debajo ?
Título: Operadores A Nivel De Bits
Publicado por: HgH en 05 de Octubre de 2003, 01:29:15 AM
 
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
Título: Operadores A Nivel De Bits
Publicado por: Degiik en 05 de Octubre de 2003, 01:55:44 PM
 Gracias.  (ole)  luego lo pruebo.
Es interesante se aprende asm.

:lol:  
Título: Operadores A Nivel De Bits
Publicado por: ethernet en 05 de Octubre de 2003, 07:41:24 PM
 eso en debug, asm sucks
Título: Operadores A Nivel De Bits
Publicado por: Astharoth en 06 de Octubre de 2003, 10:46:31 AM
 
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.