Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porCésar Miranda Olivares Modificado hace 8 años
1
Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación
2
Programación I Operadores a nivel de bits. Enmascaramiento. Campos de bits. Unidad I: Conceptos Avanzados de Programación OPERACIONES Y MANEJO DE BITS
3
Programación I Las computadoras representan todos los datos internamente como secuencia de bits. Una secuencia de 8 bits forman un byte que es la unidad estándar de almacenamiento. C puede manejar a nivel de bits (char, short, int y long). No manipula los punto flotantes. Operaciones y Manejo de Bits Operadores a Nivel de Bits:
4
Programación I Las operaciones a nivel de bits se refieren a la comprobación, asignación o desplazamiento de los bits reales que componen un byte o una palabra de memoria, que corresponden a los tipos estándar de C char, short, int y long. Los enteros no signados (unsigned) son utilizados normalmente con los operadores a nivel de bits. Las manipulaciones a nivel de bits son dependientes de la máquina. Operaciones y Manejo de Bits Operadores a Nivel de Bits:
5
Programación I Operadores Lógicos AND (&) OR inclusivo (|) OR exclusivo (^) Complemento (~) Operadores de Desplazamiento Desplazamiento izquierda (<<) Desplazamiento derecha (>>) Operadores a Nivel de Bits: Operaciones y Manejo de Bits
6
Programación I Operaciones y Manejo de Bits Operadores Lógicos a Nivel de Bits: OperadorUsoOperación &Operando & Operando Realiza una operación AND lógico entre los dos operandos |Operando | Operando Realiza una operación OR lógica entre los dos operandos ^Operando ^ Operando Realiza una operación lógica OR Exclusiva entre los dos operandos ~~Operando Complementario del operando (unario)
7
Programación I AND (&) Los bits se establecen a 1 si los bits en ambos operandos son 1. OR inclusivo (|) Los bits se establecen a 1 si por lo menos uno de los bits correspondientes en los dos operandos es 1. OR exclusivo (^) Los bits se establecen a 1 si solo uno de los bits correspondientes en los dos operandos es 1. Complemento (~) Todos los bits 0 se definen a 1 y todos los 1 se definen a 0. Operaciones y Manejo de Bits Operadores Lógicos a Nivel de Bits:
8
Programación I Operadores Lógicos a Nivel de Bits: Operaciones y Manejo de Bits COMPLEMENTO AND OROR EXCLUSIVO
9
Programación I AND (&) Los bits se establecen a 1 si los bits en ambos operandos son 1. void main (){ char letra1, letra26, res; letra1 = ‘A’; /* 65 */ letra26 = ‘Z’; /* 90 */ res = letra1 & letra26; printf(“Caracter= %c y Entero= %d”,res, res); getch(); } Operaciones y Manejo de Bits Ejemplo de Operadores a Nivel de Bits: 01000001 01011010 letra1 letra26 01000000 letra1 & letra26 M E M O R I A P A N T A L L A Caracter= @ y Entero= 64
10
Programación I OR inclusivo (|) Los bits se establecen a 1 si por lo menos uno de los bits correspondientes en los dos operandos es 1. void main (){ char letra1, letra26, res; letra1 = ‘A’; letra26 = ‘Z’; res = letra1 | letra26; printf(“Caracter= %c y Entero= %d”,res, res); getch(); } Operaciones y Manejo de Bits Ejemplo de Operadores a Nivel de Bits: 01000001 01011010 letra1 letra26 01011011 letra1 | letra26 M E M O R I A P A N T A L L A Caracter= [ y Entero= 91
11
Programación I OR exclusivo (^) Los bits se establecen a 1 si solo uno de los bits correspondientes en los dos operandos es 1. void main (){ char letra1, letra26, res; letra1 = ‘A’; letra26 = ‘Z’; res = letra1 ^ letra26; printf(“Caracter= %c y Entero= %d”,res, res); getch(); } Operaciones y Manejo de Bits Ejemplo de Operadores a Nivel de Bits: 01000001 01011010 letra1 letra26 00011011 letra1 ^ letra26 M E M O R I A P A N T A L L A Caracter= ← y Entero= 27
12
Programación I Complemento (~) Todos los bits 0 se definen a 1 y todos los 1 se definen a 0. void main (){ char letra, res; letra = ‘Z’; res = ~ letra; printf(“Caracter= %c y Entero= %d”,res, res); getch(); } Operaciones y Manejo de Bits Ejemplo de Operadores a Nivel de Bits: 01011010 letra 10100101 ~letra M E M O R I A P A N T A L L A Caracter= Ñ y Entero= -91 En realidad el resultado es 165(Ñ), pero como la capacidad de almacenamiento de 8 bits es 2 8 -1=255 con rango [-128,127] entonces calcula 165-127=38 y luego -128-1+38=-91
13
Programación I Para que esto no suceda se puede obviar el rango negativo, de la siguiente manera: void main (){ unsigned char letra, res; letra = ‘Z’; res = ~ letra; printf(“Caracter= %c y Entero= %d”,res, res); getch(); } Operaciones y Manejo de Bits Ejemplo de Operadores a Nivel de Bits: 01011010 letra 10100101 ~letra M E M O R I A P A N T A L L A Caracter= Ñ y Entero= 165
14
Programación I Operaciones y Manejo de Bits Operadores de Desplazamiento a Nivel de Bits: OperadorUsoOperación >> Operando >> Despl Desplaza bits del Operando hacia la derecha las posiciones indicadas por Despl (con signo) y rellena con cero a la izquierda. <<Operando << Despl Desplaza bits del Operando hacia la izquierda las posiciones indicadas por Despl (con signo) y rellena con cero a la derecha.
15
Programación I Desplazamiento (>>) Desplaza bits del Operando hacia la derecha las posiciones indicadas por Despl (con signo) y rellena con 0 a la izquierda. void main (){ char letra, res; letra = ‘Z’; res = letra >>3; printf(“Caracter= %c y Entero= %d”,res, res); getch(); } Operaciones y Manejo de Bits Ejemplo de Operadores a Nivel de Bits: 01011010 letra 00001011 letra >> 3 M E M O R I A P A N T A L L A Caracter= ♂ y Entero= 11 bits perdidos bits de relleno
16
Programación I Desplazamiento (<<) Desplaza bits del Operando hacia la izquierda las posiciones indicadas por Despl (con signo) y rellena con 0 a la derecha. void main (){ char letra, res; letra = ‘Z’; res = letra <<3; printf(“Caracter= %c y Entero= %d”,res, res); getch(); } Operaciones y Manejo de Bits Ejemplo de Operadores a Nivel de Bits: 01011010 letra 11010000 letra << 3 M E M O R I A P A N T A L L A Caracter= ð y Entero= 208 bits perdidos bits de relleno
17
Programación I En las operaciones con desplazamiento de bits descritas, se toma en cuenta el signo, por ejemplo: Desplazamiento a la Derecha: 128 >> 1 retorna 128 / 2 1 = 64 256 >> 4 retorna 256 / 2 4 = 16 -256 >> 4 retorna -256 / 2 4 = -16 Desplazamiento a la Izquierda: 128 << 1 retorna 128 * 2 1 = 256 16 << 2 retorna 16 * 2 2 = 64 -16 << 2 retorna -16 *2 2 = -64 Operaciones y Manejo de Bits Operadores de Desplazamiento a Nivel de Bits:
18
Programación I El enmascaramiento se utiliza para ocultar información, esto se hace mediante máscaras que se encargan de esconder (disfrazar) algunos bits en un valor, mientras otros bits se seleccionan. El enmascaramiento se logra con los operadores lógicos &, | y ^. Para cada operador el tipo de enmascaramiento funciona de un modo distinto. Operaciones y Manejo de Bits Enmascaramiento:
19
Programación I Supongamos que en un dato entero corto (por ejemplo, el código de un empleado) fue codificada información de tal manera que los bits 4 y 5 representan el estado civil, con las siguientes combinaciones: Bits 4 y 5 son 2 bits y cada bit tiene 2 posibles valores 0/1. Entonces, hay 2 #bits combinaciones. Esto es, 2 2 = 4 combinaciones. Operaciones y Manejo de Bits Enmascaramiento: 00010011 00110000 00100000 0 1000011 76543210 =67 soltero ------> 0 =4115 casado -> 16 =544 divorciado ->32 2096 viudo ------> 48 00010000 00001000 00000010 0 0000000 15141312111098
20
Programación I Operaciones y Manejo de Bits void main (){ short int codigo=64, mascara, op; /* 01000000 */ printf(“1. Soltero\n”); printf(“2. Casado\n”); printf(“3. Divorciado\n”); printf(“4. Viudo\n”); printf(“Opcion: ”); scanf(“%d”,&op); switch(op){ case 1: { mascara=0; break;} case 2: { mascara=16; break;} case 3: { mascara=32; break;} case 4: { mascara=48; break;} } codigo=codigo | mascara; printf(“Su codigo es: %d\n”, codigo); getch(); } 01000000 00010000 codigo mascara 01010000 codigo|mascara M E M O R I A P A N T A L L A Codificación de información:
21
Programación I Copia los bits indicados del patrón original y el resto de bits los anula ó hace cero. La máscara debe tener 1 en el bit que se desea copiar y 0 si el bit se desea anular. Operaciones y Manejo de Bits Enmascaramiento con Operador &:
22
Programación I Operaciones y Manejo de Bits Enmascaramiento con Operador &: void main (){ short int codigo, mascara, res; codigo = 80; /* 01010000 */ mascara = 48; /* 00110000 */ res = codigo & mascara; printf(“Resultado = %d\n”, res); getch(); } 01010000 00110000 codigo mascara 00010000 codigo&mascara M E M O R I A P A N T A L L A Resultado = 16 switch(res){ case 0: printf(“Es soltero\n”); break; case 16: printf(“Es casado\n”); break; case 32: printf(“Es divorciado\n”); break; case 48: printf(“Es viudo\n”); break; } Es casado
23
Programación I Copia los bits indicados del patrón original y el resto de bits los hace uno. La máscara debe tener 0 en el bit que se desea copiar y 1 si el bit se desea hacer 1. Operaciones y Manejo de Bits Enmascaramiento con Operador | (ó inclusiva): void main (){ short int codigo, mascara, res; codigo = 83; mascara = 48 /* 00110000 */ res = codigo | mascara; printf(“Resultado = %d”, res); getch(); } 01010011 11001111 codigo mascara 11011111 codigo|mascara M E M O R I A P A N T A L L A Resultado = 223
24
Programación I Copia los bits indicados del patrón original y el resto de bits los invierte. La máscara debe tener 0 en el bit que se desea copiar y 1 si el bit se desea invertir. Operaciones y Manejo de Bits Enmascaramiento con Operador ^ (ó exclusiva): void main (){ short int codigo, mascara, res; codigo = 83; mascara = 48 /* 00110000 */ res = codigo ^ mascara; printf(“Resultado = %d”, res); getch(); } 01010011 11001111 codigo mascara 10011100 codigo^mascara M E M O R I A P A N T A L L A Resultado = 156
25
Programación I Operaciones y Manejo de Bits Programa para visualizar bits #include void mostrarBits(unsigned); int main() { unsigned x; printf("Introduzca un entero sin signo: "); scanf("%u", &x); mostrarBits(x); return 0; } void mostrarBits (unsigned valor) { unsigned c, mascara = 1<<31; printf("%7u = ", valor); for (c=1;c<=32;c++) { putchar(valor & mascara ? '1': '0'); valor <<=1; if (c% 8 ==0) putchar(' '); } putchar('\n'); }
26
Programación I Cada operador a nivel de bits (a excepción del operador de complemento) tiene un operador de asignación correspondiente: Operaciones y Manejo de Bits Operadores a Nivel de Bits: &= |= ^= <<= >>= Operador de asignación AND a nivel de bits Operador de asignación OR inclusivo a nivel de bits Operador de asignación OR exclusivo a nivel de bits Operador de asignación de desplazamiento a la izquierda Operador de asignación de desplazamiento a la derecha
27
Programación I C proporciona la capacidad de especificar o definir el número de bits en el cual se almacena un miembro unsigned o int de una estructura o de una unión. Los miembros de campos de bits deben ser declarados como int o unsigned. Operaciones y Manejo de Bits Campos de Bits: struct CamposBits { unsigned edad : 4; unsigned peso : 2; unsigned color : 1; } Máquina con palabra de 4 bytes:... edad peso color
28
Programación I Es posible especificar un campo de bits sin nombre, en cuyo caso el campo se utiliza en la estructura como un campo de relleno. Operaciones y Manejo de Bits Campos de Bits: struct CamposBits { unsigned edad : 4; unsigned : 4; unsigned color : 1; } Máquina con palabra de 4 bytes:... edad color
29
Programación I Un campo de bits sin nombre con ancho cero, se utiliza para alinear el siguiente campo de bits en el límite de la nueva unidad de almacenamiento. Operaciones y Manejo de Bits Campos de Bits: struct CamposBits { unsigned edad : 4; unsigned : 0; unsigned color : 1; } Máquina con palabra de 4 bytes:... edad color...
30
Programación I Los campos de bits son accedidos del mismo modo que los miembros de otras estructuras y pueden aparecer en expresiones aritméticas como cantidades enteras sin signo. Sin embargo, hay restricciones en su uso, como lo son: Operaciones y Manejo de Bits Campos de Bits: No se permiten arreglos de campos de bits. El operador & dirección no se puede aplicar a un campo de bits. Un puntero no puede acceder a un campo de bits. Una función no puede devolver un campo de bits.
31
Programación I Operaciones y Manejo de Bits Ejemplo de Campos de Bits: struct estudiante { unsigned edad : 7; /*Entre 0 y 70 años*/ unsigned : 1; unsigned carrera: 4; /*Existen 11 carreras*/ unsigned : 4; unsigned sexo : 1; } Máquina con palabra de 4 bytes:... edad carrera sexo
32
Programación I Operaciones y Manejo de Bits Ejemplo de Campos de Bits. #include “stdio.h” #include “conio.h” typedef struct { unsigned edad : 7; /*entre 0 y 70 años*/ unsigned : 1; unsigned carrera: 4; /*Existen 11 carreras*/ unsigned : 4; unsigned sexo : 1; } Estudiante; printf(“\nCarrera: 0 ->Informatica”); printf(“\n 1 ->Electrónica”); printf(“\n 6 ->Ambiental\n”); scanf(“%d”, &carrera); vector[i].carrera=carrera; printf(“\nIngrese el sexo F/M: ”); s=toupper(getche()); vector[i].sexo = (s==‘F’)? 0: 1; fflush(stdin); } for (i=0; i<5; i++) { printf(“\n\nEdad: %d”, vector[i].edad); printf(“\nCarrera: %d”, vector[i].carrera); printf(“\nSexo: %d”, vector[i].sexo); } getch(); } void main() { Estudiante vector[5]; int i, edad, carrera; char s; for (i=0; i<5; i++) { printf(“\nIngrese la edad: ”); scanf(“%d”, &edad); vector[i].edad=edad;
33
Programación I Conceptos Avanzados de Programación Operaciones y Manejo de Bits
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.