Curso de Programación en C/Prog126

De WikiCabal
Saltar a: navegación, buscar

Prog126

#include <stdio.h>

int main( void )
{
  /* Bit Fiddling
   *
   * Bitwise logical operadores, unary operadores
   * ~, &,  |   y  ^
   *    &=, |=  y  ^=
   * >>, >>=, << y <<=
   *
   */

  unsigned int i,
	       Num;

  puts( "\nOnes Complement o Bitwise negación o Not operador \"~\"" );
  for( Num = 4294967295; Num > 4294967284; Num-- )
    printf( "\t~%u o ~%x = %u o %x\n", Num, Num, ~Num, ~Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;

  puts( "\nBitwise AND \"&\"" );
  for( Num = 0xffff; Num > 0xfff4; Num-- )
    printf( "\t(65535 & %d) o (ffff & %x) = %u o %x\n",
		                Num, Num, 0xffff & Num, 0xffff & Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;
  puts( "Puedes usar el operador \"&=\" también" );
  Num = 0xffff;
  Num &= 0xfff5;
  printf( "Num &= 0xfff5 nos da %x\n", Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;

  puts( "\nBitwise OR \"|\"" );
  for( Num = 0; Num < 11; Num++ )
    printf( "\t(0 | %d) o (0000 | %x) = %u o %x\n",
		                Num, Num, 0 | Num, 0 | Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;
  puts( "Puedes usar el operador \"|=\" también" );
  Num = 0;
  Num |= 5;
  printf( "Num |= 5 nos da %x\n", Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;

  puts( "\nBitwise XOR \"^\"" );
  for( Num = 65535; Num > 65524; Num-- )
    printf( "\t(65535 ^ %d) o (ffff ^ %x) = %u o %x\n",
		                Num, Num, 65535 ^ Num, 65535 ^ Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;
  puts( "Puedes usar el operador \"^=\" también" );
  Num = 65535;
  Num ^= 65528;
  printf( "Num ^= 65528 nos da %x\n", Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;

  puts( "Existe el shift al ezquierda operador \"<<\"" );
  Num = 0xffffffff;
  printf( "\t(Num << 1) Nos da %x y después Num = %x\n", (Num << 1), Num );
  printf( "\t(Num << 2) Nos da %x y después Num = %x\n", (Num << 2), Num );
  printf( "\t(Num << 3) Nos da %x y después Num = %x\n", (Num << 3), Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;
  puts( "Puedes usar el operador \"<<=\" también" );
  Num = 0xffffffff;
  for( i = 1; i < 9; i++ )
  {
    Num <<= i;
    printf( "\tDespués de (Num <<= %d), "
            "Num se cambio a %08x en manera permanente\n", i, Num );
  }
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;

  puts( "Existe el shift a la derecha operador \">>\"" );
  Num = 0xffffffff;
  printf( "\t(Num >> 1) Nos da %x y después Num = %x\n", (Num >> 1), Num );
  printf( "\t(Num >> 2) Nos da %x y después Num = %x\n", (Num >> 2), Num );
  printf( "\t(Num >> 3) Nos da %x y después Num = %x\n", (Num >> 3), Num );
  puts( "\nPresión <Enter> para continuar" );
  while( ( Num = getchar() ) != '\n' );
    ;
  puts( "Puedes usar el operador \">>=\" también" );
  Num = 0xffffffff;
  for( i = 1; i < 9; i++ )
  {
    Num >>= i;
    printf( "\tDespués de (Num >>= %d), "
            "Num se cambio a %08x en manera permanente\n", i, Num );
  }
  return 0;
}

Resultado

[rrc@AbelLap CClase]$ gcc -Wall -o Prog126 Prog126.c 
[rrc@AbelLap CClase]$ ./Prog126

Ones Complement o Bitwise negación o Not operador "~"
	~4294967295 o ~ffffffff = 0 o 0
	~4294967294 o ~fffffffe = 1 o 1
	~4294967293 o ~fffffffd = 2 o 2
	~4294967292 o ~fffffffc = 3 o 3
	~4294967291 o ~fffffffb = 4 o 4
	~4294967290 o ~fffffffa = 5 o 5
	~4294967289 o ~fffffff9 = 6 o 6
	~4294967288 o ~fffffff8 = 7 o 7
	~4294967287 o ~fffffff7 = 8 o 8
	~4294967286 o ~fffffff6 = 9 o 9
	~4294967285 o ~fffffff5 = 10 o a

Presión <Enter> para continuar


Bitwise AND "&"
	(65535 & 65535) o (ffff & ffff) = 65535 o ffff
	(65535 & 65534) o (ffff & fffe) = 65534 o fffe
	(65535 & 65533) o (ffff & fffd) = 65533 o fffd
	(65535 & 65532) o (ffff & fffc) = 65532 o fffc
	(65535 & 65531) o (ffff & fffb) = 65531 o fffb
	(65535 & 65530) o (ffff & fffa) = 65530 o fffa
	(65535 & 65529) o (ffff & fff9) = 65529 o fff9
	(65535 & 65528) o (ffff & fff8) = 65528 o fff8
	(65535 & 65527) o (ffff & fff7) = 65527 o fff7
	(65535 & 65526) o (ffff & fff6) = 65526 o fff6
	(65535 & 65525) o (ffff & fff5) = 65525 o fff5

Presión <Enter> para continuar

Puedes usar el operador "&=" también
Num &= 0xfff5 nos da fff5

Presión <Enter> para continuar


Bitwise OR "|"
	(0 | 0) o (0000 | 0) = 0 o 0
	(0 | 1) o (0000 | 1) = 1 o 1
	(0 | 2) o (0000 | 2) = 2 o 2
	(0 | 3) o (0000 | 3) = 3 o 3
	(0 | 4) o (0000 | 4) = 4 o 4
	(0 | 5) o (0000 | 5) = 5 o 5
	(0 | 6) o (0000 | 6) = 6 o 6
	(0 | 7) o (0000 | 7) = 7 o 7
	(0 | 8) o (0000 | 8) = 8 o 8
	(0 | 9) o (0000 | 9) = 9 o 9
	(0 | 10) o (0000 | a) = 10 o a

Presión <Enter> para continuar

Puedes usar el operador "|=" también
Num |= 5 nos da 5

Presión <Enter> para continuar


Bitwise XOR "^"
	(65535 ^ 65535) o (ffff ^ ffff) = 0 o 0
	(65535 ^ 65534) o (ffff ^ fffe) = 1 o 1
	(65535 ^ 65533) o (ffff ^ fffd) = 2 o 2
	(65535 ^ 65532) o (ffff ^ fffc) = 3 o 3
	(65535 ^ 65531) o (ffff ^ fffb) = 4 o 4
	(65535 ^ 65530) o (ffff ^ fffa) = 5 o 5
	(65535 ^ 65529) o (ffff ^ fff9) = 6 o 6
	(65535 ^ 65528) o (ffff ^ fff8) = 7 o 7
	(65535 ^ 65527) o (ffff ^ fff7) = 8 o 8
	(65535 ^ 65526) o (ffff ^ fff6) = 9 o 9
	(65535 ^ 65525) o (ffff ^ fff5) = 10 o a

Presión <Enter> para continuar

Puedes usar el operador "^=" también
Num ^= 65528 nos da 7

Presión <Enter> para continuar

Existe el shift al ezquierda operador "<<"
	(Num << 1) Nos da fffffffe y después Num = ffffffff
	(Num << 2) Nos da fffffffc y después Num = ffffffff
	(Num << 3) Nos da fffffff8 y después Num = ffffffff


Presión <Enter> para continuar

Puedes usar el operador "<<=" también
        Después de (Num <<= 1), Num se cambio a fffffffe en manera permanente
        Después de (Num <<= 2), Num se cambio a fffffff8 en manera permanente
        Después de (Num <<= 3), Num se cambio a ffffffc0 en manera permanente
        Después de (Num <<= 4), Num se cambio a fffffc00 en manera permanente
        Después de (Num <<= 5), Num se cambio a ffff8000 en manera permanente
        Después de (Num <<= 6), Num se cambio a ffe00000 en manera permanente
        Después de (Num <<= 7), Num se cambio a f0000000 en manera permanente
        Después de (Num <<= 8), Num se cambio a 00000000 en manera permanente

Presión <Enter> para continuar

Existe el shift a la derecha operador ">>"
        (Num >> 1) Nos da 7fffffff y después Num = ffffffff
        (Num >> 2) Nos da 3fffffff y después Num = ffffffff
        (Num >> 3) Nos da 1fffffff y después Num = ffffffff

Presión <Enter> para continuar

Puedes usar el operador ">>=" también
        Después de (Num >>= 1), Num se cambio a 7fffffff en manera permanente
        Después de (Num >>= 2), Num se cambio a 1fffffff en manera permanente
        Después de (Num >>= 3), Num se cambio a 03ffffff en manera permanente
        Después de (Num >>= 4), Num se cambio a 003fffff en manera permanente
        Después de (Num >>= 5), Num se cambio a 0001ffff en manera permanente
        Después de (Num >>= 6), Num se cambio a 000007ff en manera permanente
        Después de (Num >>= 7), Num se cambio a 0000000f en manera permanente
        Después de (Num >>= 8), Num se cambio a 00000000 en manera permanente

[rrc@AbelLap CClase]$ 

Explicación