Curso de Programación en C/Prog126
Ir a la navegación
Ir a la búsqueda
Prog126
1 #include <stdio.h>
2
3 int main( void )
4 {
5 /* Bit Fiddling
6 *
7 * Bitwise logical operadores, unary operadores
8 * ~, &, | y ^
9 * &=, |= y ^=
10 * >>, >>=, << y <<=
11 *
12 */
13
14 unsigned int i,
15 Num;
16
17 puts( "\nOnes Complement o Bitwise negación o Not operador \"~\"" );
18 for( Num = 4294967295; Num > 4294967284; Num-- )
19 printf( "\t~%u o ~%x = %u o %x\n", Num, Num, ~Num, ~Num );
20 puts( "\nPresión <Enter> para continuar" );
21 while( ( Num = getchar() ) != '\n' );
22 ;
23
24 puts( "\nBitwise AND \"&\"" );
25 for( Num = 0xffff; Num > 0xfff4; Num-- )
26 printf( "\t(65535 & %d) o (ffff & %x) = %u o %x\n",
27 Num, Num, 0xffff & Num, 0xffff & Num );
28 puts( "\nPresión <Enter> para continuar" );
29 while( ( Num = getchar() ) != '\n' );
30 ;
31 puts( "Puedes usar el operador \"&=\" también" );
32 Num = 0xffff;
33 Num &= 0xfff5;
34 printf( "Num &= 0xfff5 nos da %x\n", Num );
35 puts( "\nPresión <Enter> para continuar" );
36 while( ( Num = getchar() ) != '\n' );
37 ;
38
39 puts( "\nBitwise OR \"|\"" );
40 for( Num = 0; Num < 11; Num++ )
41 printf( "\t(0 | %d) o (0000 | %x) = %u o %x\n",
42 Num, Num, 0 | Num, 0 | Num );
43 puts( "\nPresión <Enter> para continuar" );
44 while( ( Num = getchar() ) != '\n' );
45 ;
46 puts( "Puedes usar el operador \"|=\" también" );
47 Num = 0;
48 Num |= 5;
49 printf( "Num |= 5 nos da %x\n", Num );
50 puts( "\nPresión <Enter> para continuar" );
51 while( ( Num = getchar() ) != '\n' );
52 ;
53
54 puts( "\nBitwise XOR \"^\"" );
55 for( Num = 65535; Num > 65524; Num-- )
56 printf( "\t(65535 ^ %d) o (ffff ^ %x) = %u o %x\n",
57 Num, Num, 65535 ^ Num, 65535 ^ Num );
58 puts( "\nPresión <Enter> para continuar" );
59 while( ( Num = getchar() ) != '\n' );
60 ;
61 puts( "Puedes usar el operador \"^=\" también" );
62 Num = 65535;
63 Num ^= 65528;
64 printf( "Num ^= 65528 nos da %x\n", Num );
65 puts( "\nPresión <Enter> para continuar" );
66 while( ( Num = getchar() ) != '\n' );
67 ;
68
69 puts( "Existe el shift al ezquierda operador \"<<\"" );
70 Num = 0xffffffff;
71 printf( "\t(Num << 1) Nos da %x y después Num = %x\n", (Num << 1), Num );
72 printf( "\t(Num << 2) Nos da %x y después Num = %x\n", (Num << 2), Num );
73 printf( "\t(Num << 3) Nos da %x y después Num = %x\n", (Num << 3), Num );
74 puts( "\nPresión <Enter> para continuar" );
75 while( ( Num = getchar() ) != '\n' );
76 ;
77 puts( "Puedes usar el operador \"<<=\" también" );
78 Num = 0xffffffff;
79 for( i = 1; i < 9; i++ )
80 {
81 Num <<= i;
82 printf( "\tDespués de (Num <<= %d), "
83 "Num se cambio a %08x en manera permanente\n", i, Num );
84 }
85 puts( "\nPresión <Enter> para continuar" );
86 while( ( Num = getchar() ) != '\n' );
87 ;
88
89 puts( "Existe el shift a la derecha operador \">>\"" );
90 Num = 0xffffffff;
91 printf( "\t(Num >> 1) Nos da %x y después Num = %x\n", (Num >> 1), Num );
92 printf( "\t(Num >> 2) Nos da %x y después Num = %x\n", (Num >> 2), Num );
93 printf( "\t(Num >> 3) Nos da %x y después Num = %x\n", (Num >> 3), Num );
94 puts( "\nPresión <Enter> para continuar" );
95 while( ( Num = getchar() ) != '\n' );
96 ;
97 puts( "Puedes usar el operador \">>=\" también" );
98 Num = 0xffffffff;
99 for( i = 1; i < 9; i++ )
100 {
101 Num >>= i;
102 printf( "\tDespués de (Num >>= %d), "
103 "Num se cambio a %08x en manera permanente\n", i, Num );
104 }
105 return 0;
106 }
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]$