Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Operadores A Nivel De Bits

Iniciado por J_F_NASH, 30 de Septiembre de 2003, 01:36:10 PM

« anterior - próximo »

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.

Mars Attacks

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?

BeRSeRKeR

 ¡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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

MA]Mestre

  (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.

sés

 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.
Soy indeciso... ¿o no?

synchrnzr

 Me suena que con variables unsigned haría un desplazamiento lógico y no aritmético ^_^'

sync

sés

 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
Soy indeciso... ¿o no?

synchrnzr

 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

sés

 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.
Soy indeciso... ¿o no?

synchrnzr

 Grosso errore:

2147483642 = 01111111 11111111 11111111 11111010

sync

sés

 Cierto, separé mal los "1" ^_^

puse:
11111111 11111111 1111111 11111010

y es:
01111111 11111111 11111111 11111010
Soy indeciso... ¿o no?

synchrnzr

 Y el 0 de delante viene porque el desplazamiento que hace con unsigneds es lógico y no aritmético (ole)

sync

sés

 Sigue siendo aritmético, lo que pasa es que "sin signo"; por eso no lo mantiene.
Soy indeciso... ¿o no?

HgH

 mmm... ¿y por que no nos vamos a la fuente del problema?:

(código copypasteado del post de sync) :P




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

gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

ethernet







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.