Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: david_BS en 4 Abril 2012, 15:51 pm



Título: Operadores de bits
Publicado por: david_BS en 4 Abril 2012, 15:51 pm
Hola, esto viene a ser una demostración con ejemplos más que un tutorial.
Básicamente vamos a hacer una revisión de todos los operadores de bits del lenguaje C y mostrar su funcionamiento.

Citar
&        AND
&=      AND Asignativo
|         OR
|=       OR  Asignativo
^        XOR
^=      XOR Asignativo
~        Complemento de Uno
<<      Desplazamiento Izquierdo
<<=    Desplazamiento Izquierdo Asignativo
>>      Desplazamiento Derecho
>>=    Desplazamiento Derecho Asignativo

Para mostrar su funcionamiento, pongo  ejemplos de este enlace:

http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/bitwise.html

Sólo que traduje lo que estaba en otro idioma e hice una combinación de todos los ejemplos como para que quede algo entendible.


AND - OR - XOR ( requieren dos operandos y hacen comparaciones de bits.)
=================================================

AND & copia un bit al resultado si existe en los dos operandos.
   
Código:
unsigned int a = 60;	/* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
unsigned int c = 0;
c = a & b;              /* 12 = 0000 1100 */
   

OR | copia un bit al resultado si existe en algún operando.

Código:
unsigned int a = 60;	/* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
unsigned int c = 0;  
c = a | b;              /* 61 = 0011 1101 */

XOR ^ copia un bit al resultado si existe en un operando y no en otro.

Código:
unsigned int a = 60;	/* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
unsigned int c = 0;
c = a ^ b;              /* 49 = 0011 0001 */



Complemento de uno ( es unario (require un operando))
======================================

NOT ~ tiene el efecto de invertir bits.

Código:
unsigned int Valor=4;          /*   4 = 0000 0100 */
Valor = ~ Valor;               /* 251 = 1111 1011 */



Cambio de bits
============

Los siguientes operadores se usan para desplazar bits a la derecha o izquierda.

Código:
<< ; >> ; <<= ; >>=

El valor del operando izquierdo es movido a la derecha o izquierda por el número de bits especificado
en el operando derecho.
Por ejemplo:

Código:
unsigned int Valor=4;                   /*  4 = 0000 0100 */
unsigned int Desplazamiento=2;
Valor = Valor << Desplazamiento;        /* 16 = 0001 0000 */
Valor <<= Desplazamiento;               /* 64 = 0100 0000 */
printf("%d\n", Valor);                  /* Muestra 64     */

Usualmente, El bit vacío resultante es asignado como cero (padding).

Nota: Siempre use variables 'unsigned' con estos operadores para eludir resultados impredecibles.

Los usos de enumeran a continuación pero los ejemplos se los dejo para que los busquen en la red, o si los usuarios del foro de C/C++ se animan a poner sus ejemplos personales del uso de estos operadores XD

Citar
Usos para Operadores de Bits:
=====================
- Extraer y borrar valores
- Insertar y combinar valores
- Intercambiar variables
- Reemplazar operaciones aritméticas

De todas formas dejo para descargar un proyecto que es parte de esta demostración,  y dentro de la carpeta que tiene, hay otra con ejemplos tomados de la web original.

Proyecto MSVC++ 6.0 (http://www.mediafire.com/?qdravvtuv9uqj38)


Título: Re: Operadores de bits
Publicado por: durasno en 4 Abril 2012, 17:44 pm
Hola! muy bueno el trabajo q te tomaste, pero hay algo q no me gusta y es cuando decis COPIA. Tal vez quedaria mejor decir(tomamos el AND): pone un 1 cuando los bits estan en 1

Nuevamente muy bueno el aporte, saludos


Título: Re: Operadores de bits
Publicado por: david_BS en 4 Abril 2012, 22:04 pm
claro, pero te digo algo no es que yo hubiera elegido esa palabra sino que en el texto original dice así..
http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/bitwise.html

Citar
AND & will copy a bit to the result if it exists in both operands.

osea es como decir 'va a copiar' o 'copiará', o en presente 'copia'

pero me parece que está bien porque no se refiere en sí a la operación AND, sino a lo que ocurre con esas 3 variables A, B y C, desde el punto de vista del código.
Es decir, lo que resulte de comparar A y B 'se copia' al resultado C. Se podía haber usado otra expresión, 'se copia', 'se pasa', 'se translada', 'da como resultado', en fin, porque se refiere más que nada al resultado y no a la operación.
Igualmente esto no es ni siquiera un tutorial, y estaría bueno dar más ejemplos del uso de estos operadores. hay comentarios de gente que dice que no son de mucha utilidad, pero no me parece que sea así


Título: Re: Operadores de bits
Publicado por: durasno en 4 Abril 2012, 22:37 pm
Eso de "copiar" puede que en algun tutorial, manual, pagina web etc, este bien; pero cuando se trata el tema operaciones de bit ya sea en Electronica o en Sistemas, ese termino no es el correcto
De todas formas es un buen aporte para aquellos que se inician en C

Saludos

PD: si es muy importante este tema aunque mas que nada se usa en un nivel de programacion avanzado