Está en la página 1de 70

Ampliación de Programación

TEMA 2
Indice de contenidos

1. Objetivos

2. Introducción

3. Borland C++ Builder

4. Tipos de datos

5. Funciones. Programación modular

6. Operaciones con bits. Máscaras

7. Bibliografía

INFORMÀTICA 2
INDUSTRIAL
1. Objetivos

• Afianzar los conocimientos de C de asignaturas anteriores

• Conocer las técnicas de programación necesarias para abordar


el desarrollo de SII

• Introducir el entorno de desarrollo rápido de aplicaciones


Borland C++ Builder

INFORMÀTICA 3
INDUSTRIAL
2. Introducción

INFORMÀTICA 4
INDUSTRIAL
2. Introducción

• Evolución de las técnicas de programación imperativa

Programación BASIC
secuencial FORTRAN

Programación PASCAL
funcional

Programación C
modular

Programación C++ (Turbo C, C++ Builder)


orientada a objetos ObjectPascal (Delphi), Basic (VisualBasic), ...

INFORMÀTICA 5
INDUSTRIAL
2. Introducción

• Evolución técnicas programación imperativa

Programación Fundamentos
secuencial Informática (1º)

Programación
funcional

Programación Informática
modular Industrial (2º)

Programación
orientada a objetos

INFORMÀTICA 6
INDUSTRIAL
2. Introducción

• Elegimos el lenguaje C para trabajar

• ¿Para qué se crea C?


– Se quiere escribir un sistema operativo (Unix) intentando evitar el
lenguaje ensamblador
– Para ello se inventa un nuevo lenguaje de programación
• Tan rápido como el código máquina.
• De alto nivel.
• Portable.
• Modular. Basado en bibliotecas (libraries).

– Su éxito hace que salte de UNIX a otros entornos y propósitos


• Programación desde microcontroladores hasta supercomputadores
• Desarrollo de todo tipo de aplicaciones.

• Evolución de C

K&R ANSI C C++

INFORMÀTICA 7
INDUSTRIAL
2. Introducción

• Del fuente al ejecutable Fuente .c

Preprocesado

Fuente’ .c

Compilado

Objeto .obj Objeto

Enlazado (link)

Ejecutable .exe
bibliotecas

INFORMÀTICA 8
INDUSTRIAL
2. Introducción

• Del fuente al ejecutable Fuente .c


#include <stdio.h>
#include <math.h>
#define PI 3.14 Preprocesado
void main(void) {
double v,r; Fuente’ .c
v=1.5;
r=PI*sin(v);
printf("Resultado: %f\n",r); Compilado
}
int printf(char *arg,...);
double sin(double); Objeto .obj Objeto
void main(void) {
double v,r;
Enlazado (link)
v=1.5;
r=3.14*sin(v);
printf("Resultado: %f\n",r); Ejecutable .exe Bibliotecas
}

INFORMÀTICA 9
INDUSTRIAL
2. Introducción

• Del fuente al ejecutable Fuente .c

Preprocesado
B522758117750BFF750CFF7
108010000E39C2D3C2D4128
02475080112800002260202
0D412802B2274011281932C
Fuente’ .c
000E41281D1E4F0E41281D1
? sin()
? printf() Compilado
sin()
Objeto .obj printf()
B522758117750BFF750CFF7
108010000E39C2D3C2D4128
02475080112800002260202 Enlazado
0D412802B2274011281932C
000E41281D1E4F0E41281D1
02475080112800002260202
0D412802B2274011281932C Ejecutable .exe Bibliotecas

INFORMÀTICA 10
INDUSTRIAL
3. Borland C++ Builder

INFORMÀTICA 11
INDUSTRIAL
3. Borland C++ Builder

• Entorno en Windows para el desarrollo de aplicaciones C/C++.


• Filosofía de programación visual (VCL) y desarrollo rápido de
aplicaciones (RAD).
• Permite el desarrollo de diferentes tipos de aplicaciones: consola
(las de MS-DOS en TurboC), ventanas Windows, librerías
dinámicas (DLL), componentes, ...
• Por defecto, al arrancar crea una aplicación vacía tipo ventana de
Windows.

• ¿Por qué elegimos C++ Builder?


– Trabajar en Windows con herramientas de última generación.
– Más fácil de usar que los entornos C de otras compañías.
– Es sencillo desarrollar aplicaciones de aspecto profesional.
– La filosofía de componentes permite desarrollar aplicaciones para resolver
cualquier problema sin ser un experto programador.

INFORMÀTICA 12
INDUSTRIAL
3. Borland C++ Builder

• Aspecto de C++ Builder al arrancar

Para obtener ayuda del entorno se usa el menú Help o


se selecciona el objeto o tema que nos interesa
y se pulsa la tecla F1.

INFORMÀTICA 13
INDUSTRIAL
3. Borland C++ Builder

• Barra de herramientas

Guardar proyecto Abrir proyecto

Abrir archivo Añadir archivo al proyecto

Ejecutar

INFORMÀTICA 14
INDUSTRIAL
3. Borland C++ Builder

• Barra de herramientas

Label Button
(Etiqueta) (Botón)

INFORMÀTICA 15
INDUSTRIAL
3. Borland C++ Builder

• Formulario (“Form”)
Objeto “Form1”

INFORMÀTICA 16
INDUSTRIAL
3. Borland C++ Builder

• Inspector de objetos: Propiedades y Eventos

Objeto “Mi_Boton”

Lista de objetos
Propiedades
Eventos

Propiedad “Caption” Evento “OnClick”

Propiedad “Name”

INFORMÀTICA 17
INDUSTRIAL
3. Borland C++ Builder

• El editor

Esqueleto función Cuerpo de la función


generado por Builder a rellenar por el programador

INFORMÀTICA 18
INDUSTRIAL
3. Borland C++ Builder

• El editor

Abrir archivo de cabecera (fichero.h)

Cerrar

Abrir archivo

INFORMÀTICA 19
INDUSTRIAL
3. Borland C++ Builder

• Propiedades, Métodos y Eventos de los Componentes

- Componentes: Objetos VCL (Visual Component Library) que


realizan una tarea específica de programación
– P.ej. Control de edición, cuadro de lista, etiqueta de texto, etc..

Objeto o Componente
Objeto o Componente
“Mi_Boton”
“Form1”

INFORMÀTICA 20
INDUSTRIAL
3. Borland C++ Builder

• Propiedades, Métodos y Eventos de los Componentes

- Propiedades: son elementos del componente que permiten el


control de su funcionamiento
– P.ej. Todos los componentes visuales tienen las propiedades “Height” y
“Left”
Propiedades

INFORMÀTICA 21
INDUSTRIAL
3. Borland C++ Builder

• Propiedades, Métodos y Eventos de los Componentes

- Eventos: Windows es un entorno orientado a eventos, como el


movimiento del ratón o la pulsación de una tecla, etc..
– En general los componentes se diseñan para responder a ciertos eventos
– P.ej. Un botón se diseña para responder a un “click” del ratón

Eventos
Evento de
click de ratón Acción del evento
o Método

INFORMÀTICA 22
INDUSTRIAL
3. Borland C++ Builder

• Propiedades, Métodos y Eventos de los Componentes

- Métodos: son las funciones que permiten a un componente realizar


diferentes acciones
– P.ej. Show(), Hide(), Close(), etc, son métodos que sirven para mostrar,
ocultar o cerrar un componente

- Para acceder a las propiedades y métodos de los componentes se


emplea el operador de punteros: ->

Form1-> Color = clRed; //Propiedad de Color

Form1-> Close(); //Método o función del formulario

Form1-> Mi_Boton -> Caption = “Hola”; //Cadena de texto

Form1-> Mi_Boton -> Width = Form1-> Boton-> Width + 10;

Form1-> Mi_Boton -> Visible = false;

INFORMÀTICA 23
INDUSTRIAL
3. Borland C++ Builder

• El gestor del proyecto: “Project Manager”


– La aplicación estará formada por distintos módulos (.cpp) y librerías (.lib)
– Se administran desde el gestor del proyecto (del menú “View”  “Project Manager”)

Añadir un archivo Eliminar archivo

Archivos que forman


parte del proyecto

Ver código

Ver
formulario

INFORMÀTICA 24
INDUSTRIAL
3. Borland C++ Builder

• Para guardar un proyecto:


1. Se deberá crear un nuevo directorio; y entrar en él
2. Se nos pedirá nombre para los distintos módulos

Nueva carpeta

INFORMÀTICA 25
INDUSTRIAL
3. Borland C++ Builder

• Los archivos que forman parte del proyecto


– La siguiente tabla muestra los archivos creados al guardar el proyecto en
blanco por defecto de Builder.

Nombre por defecto Descripción

Mi_Proyecto.bpr Descripción del proyecto. Generado automáticamente.

Mi_Proyecto.cpp Código de arranque del programa (main). Generado automáticamente.

Mi_Proyecto.res Recursos de la aplicación. Generado automáticamente.

Directivas #include y la declaración de la clase de la ventana principal


Modulo1.h
(objeto TForm). Generado automáticamente.

Instrucciones (código C++) de tratamiento de eventos relativos a la


Modulo1.cpp ventana principal. C++ Builder proporciona el esqueleto del archivo y el
prototipo de las funciones de tratamiento.

Descripción del contenido de la ventana principal y características de los


Modulo1.dfm
componentes insertados en ella. Generado automáticamente.

Resultado de la compilación. Aplicación ejecutable. No es necesario


Mi_Proyecto.exe
guardar

INFORMÀTICA 26
INDUSTRIAL
3. Borland C++ Builder

• Los archivos que forman parte del proyecto

– En el directorio donde se guarde el proyecto se deben almacenar los archivos

que forman la aplicación.

– Junto a estos archivos habrá otros que Builder crea para realizar las tareas de

compilado y enlazado. Ocuparán en total varios megas.

– Se debe trabajar siempre sobre disco duro.

– Para llevarse el proyecto en disquete, a casa, se copiarán sólo los archivos

*.cpp, *.h, *.dfm, *.res, *.bpr y los adicionales que aporte el programador para

su aplicación concreta (bases de datos, librerías, imágenes, ...).

INFORMÀTICA 27
INDUSTRIAL
Ventana MsDos de C en C++Builder 6

INFORMÀTICA 28
INDUSTRIAL
Ventana MsDos de C en C++Builder 6

INFORMÀTICA 29
INDUSTRIAL
Ventana MsDos de C en C++Builder 6

INFORMÀTICA 30
INDUSTRIAL
Ventana MsDos de C en C++Builder 6

Insertar el
código en C

INFORMÀTICA 31
INDUSTRIAL
Ventana MsDos de C en C++Builder 6

Cabeceras:
Consola (monitor) (conio.h)
E/S estándar (stdio.h)

Funciones con prototipo:


“printf ()” en (conio.h) y
“kbhit()” en (stdio.h)

INFORMÀTICA 32
INDUSTRIAL
Ventana MsDos de C en C++Builder 6

Compilar, para ejecución

Resultado de la ejecución

INFORMÀTICA 33
INDUSTRIAL
Representación de la Información

INFORMÀTICA 34
INDUSTRIAL
Hexadecimal – Binario - Decimal

INFORMÀTICA 35
INDUSTRIAL
Representación de la Información

Cambio de Base Decimal a Binario

INFORMÀTICA 36
INDUSTRIAL
Representación de la Información

INFORMÀTICA 37
INDUSTRIAL
Representación de la Información

Actividades de cambio de base

INFORMÀTICA 38
INDUSTRIAL
4. Tipos de datos

INFORMÀTICA 39
INDUSTRIAL
4. Tipos de datos

• Números enteros
tipo descripción tamaño (bytes)* rango MS-DOS rango Windows
char byte 1/1 -27 a 27 -27 a 27
int entero 2/4 -32768 a 32767 -231 a 231
long entero largo 4/4 -231 a 231 -231 a 231
(*) MS-DOS 16 bits/ WINDOWS 32 bits

• Representación externa de números enteros


int i;
i=65; <-- decimal
i=0x41; <-- hexadecimal, adecuado para números binarios
i=’A’; <-- código ASCII

• Representar un byte en C
unsigned char a;

INFORMÀTICA 40
INDUSTRIAL
4. Tipos de datos

• Los enteros se emplean para representar valores lógicos


– El valor 0 significa FALSO
– Un valor distinto de 0 significa VERDADERO

• Las operaciones lógicas son


>, =>, <, <= comprobaciones mayor, menor ...
==, != comprobación de igualdad, desigualdad
&&, || AND(Y) y OR(O) lógicos
! NO (negación)
El resultado de estas operaciones será un valor VERDADERO o FALSO

• Expresiones habituales
if (i) equivale a if (i!=0)
if (!i) equivale a if (i==0)
• En C++ existe también el tipo de dato booleano
– Se declara con boolean
– Admite los valores true y false
INFORMÀTICA 41
INDUSTRIAL
4. Tipos de datos

• Ejemplo
#include <stdio.h>
void main(void)
{
int i,j;

printf("Introduce i y j\n");
scanf ("%d %d",&i,&j);
if (i == j)
printf("son iguales\n");
if (i != j)
printf("son distintos\n");
if (i > j)
printf("i es mayor que j\n");
if ((i >=2 ) && (i <= 10))
printf("i esta entre 2 y 10\n");
if ((i >= 2) || (i <= 10))
printf("apuesto a que si\n");
if (i = 3) /**** Mal escrito!!!!****/
printf("La fastidiaste.");
}

INFORMÀTICA 42
INDUSTRIAL
4. Tipos de datos

• Números reales
tipo descripción rango Builder dígitos
float real 3.4*10-38 ... 3.4*10+38 7
double real doble precisión 1.7*10-308 ... 1.7*10+308 15

Ojo: El rango y la precisión dependen de la implementación

• Representación externa de números reales


double f;
f=3.0;
f=123.89;
f=0.2e-5;

• !Cuidado con esta pifia¡


double f;
f=1/5; <-- da 0
f=1.0/5; <-- da 0.2

INFORMÀTICA 43
INDUSTRIAL
Actividades

• Declara el tipo de variable adecuada, los valores y las


expresiones matemáticas.

– Una variable para almacenar las botellas que hay en una caja.
Asígnale el valor inicial 19.
– Una variable entera donde almacenar el numero binario 0110111101 (se
deben incluir los 10 bits)
– Un byte donde almacenar 10100101
– Una variable donde colocar la constante gravitatoria ‘g’ que vale 9’2
– Una variable donde almacenar la temperatura de un depósito de líquidos
con la mayor precisión posible.
– Una variable y el calculo 10 dividido entre 50

INFORMÀTICA 44
INDUSTRIAL
5. Funciones. Programación modular.

INFORMÀTICA 45
INDUSTRIAL
5. Funciones. Programación modular.

• Una función en formato ANSI C

Tipo de dato Nombre de Lista del tipo de los


devuelto la función datos de entrada

double media(double a, double b)


{ Declaración
double v; variables locales
v = (a + b)/2.0; Instrucciones
return(v); Devolver un valor
}

INFORMÀTICA 46
INDUSTRIAL
5. Funciones. Programación modular.

• Ejemplo de uso de la función anterior


double a = 77.7;

double media(double a, double b)


{
double v;
v = (a + b)/2.0;
return(v);
}

void main(void)
{
double a,b,res;

a=3.75; b=9.27;
res= media(a,b)+media(3.5,a);
}

• Fundamental conocer el ámbito de validez de las variables


• Una traza de este ejemplo aclara las cosas

INFORMÀTICA 47
INDUSTRIAL
5. Funciones. Programación modular.

• Las funciones deben declararse antes de usarse


• Si no se hace, C presupone que la función devuelve un
“int” y no comprueba el número y tipo de los parámetros

#include <stdio.h>
FATALIDAD
C no sabe que sin()
void main(void) devuelve un double y
{ se le pasa un double.
double v; Supone que son int

v=sin(3.1416);
printf("Seno de PI vale %lf\n",v);
}

Seno de  vale 16384.00


INFORMÀTICA 48
INDUSTRIAL
5. Funciones. Programación modular.

• Para que una función esté declarada antes de usarse debe:


– O estar escrita en el fuente antes de la función que la usa
– O escribir el encabezado de la función con un “punto y coma” al final antes
de la función que la usa (PROTOTIPO)

#include <stdio.h>
double sin(double); PROTOTIPO
Le “explicamos” a C que
void main(void) si encuentra la función sin()
{ debe saber y comprobar
double v; que devuelve un double y
se le pasa un double.
v=sin(3.1416);
printf("Seno de PI vale %lf\n",v);
}

Seno de  vale 0.001953


INFORMÀTICA 49
INDUSTRIAL
5. Funciones. Programación modular.

• Los ficheros de cabecera (.h) que se incluyen mediante la


directiva #include suelen contener prototipos de funciones
• La función está realmente escrita (implementada) en una
librería o en otro módulo
#include <stdio.h>
#include <math.h> #include significa
copiar el texto del
void main(void) fichero math.h aquí.
{
double v;

v=sin(3.14);
printf("Seno de PI vale %lf\n",v);
}

Seno de  vale 0.001953


INFORMÀTICA 50
INDUSTRIAL
5. Funciones. Programación modular.
• Aplicando programación modular al ejemplo
mimedia.c
#include "mimedia.h"

double media(double a, double b)


{
double v;
v = (a + b)/2.0;
return(v);
}
mimedia.h
double media(double a, double b);

prueba.c
#include "mimedia.h"

void main(void)
{
double a,b,res;

a=3.75; b=9.27;
res= media(a,b)+media(3.5,a);
}

INFORMÀTICA 51
INDUSTRIAL
Actividades

• Realiza un programa en C en un solo fichero que tenga

– Una función para calcular el perímetro de una circunferencia a partir del


radio (2*PI*r)
– Una función para calcular el área de un círculo (PI*r2)
– Una función para calcular el volumen de un cilindro (area_circulo*altura)
que use las funciones anteriores
– Un función principal (main) que pida el radio y la altura de un cilindro y,
usando las funciones anteriores, informe del perímetro de la parte circular
del cilindro, del área del círculo y del volumen del cilindro

INFORMÀTICA 52
INDUSTRIAL
Actividades

• Haz modular el programa anterior

– ¿Cuántos módulos propones?


– ¿Qué ventajas aporta la programación modular en este caso?

INFORMÀTICA 53
INDUSTRIAL
6. Operaciones con bits. Máscaras

INFORMÀTICA 54
INDUSTRIAL
6. Operaciones con bits. Máscaras

• El computador digital representa internamente la información,


exclusivamente, en forma de números binarios

• Por tanto, trabajar con los dispositivos hardware del sistema


suele consistir en manipular bits

• Dichos bits se representan normalmente como números


enteros

INFORMÀTICA 55
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Por ejemplo, en C podemos representar un byte y asignar valor


unsigned char i;
i=65; <-- decimal
i=0x41; <-- hexadecimal
i=’A’; <-- código ASCII
• Pero internamente se almacenará (para i=0x41)
01000001
• Para expresar un valor binario en C solo podemos recurrir a
las representaciones externas que nos ofrece, que son:
– decimal, octal, hexadecimal y carácter
• Por ejemplo, si necesitamos expresar el valor 1011101b,
podemos escribir en C
– 93 en decimal
– 0x5D en hexadecimal
– 0135 en octal

INFORMÀTICA 56
INDUSTRIAL
6. Operaciones con bits. Máscaras

• La forma más fácil de trabajar con números binarios en C es


representarlos en hexadecimal
• Por ejemplo, para representar el siguiente número haremos
1º Grupos de 4 bits empezando desde la derecha
2º Sustituir cada grupo por el valor hexadecimal de cada grupo

01101011110100111101010101b

1 A F 4 F 5 5

1AF4F55h --> 0x1AF4F55 en C

INFORMÀTICA 57
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Otra forma con un paso intermedio


1º Grupos de 4 bits empezando desde la derecha
2º Calcular el valor decimal de cada grupo a partir del peso de cada bit
b3 b2 b1 b0 --> 23 22 21 20 --> 8 4 2 1
3º Sustituir cada valor decimal por el valor hexadecimal correspondiente

01101011110100111101010101b

1 10 15 4 15 5 5

1 A F 4 F 5 5
1AF4F55h --> 0x1AF4F55 en C
INFORMÀTICA 58
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Operadores C que trabajan a nivel de bit


Operador Binario Función
& (AND) Y a nivel de bit
| (OR) O a nivel de bit
^ (XOR) O Exclusiva a nivel de bit
Operador Unario Función
 (NOT) NO a nivel de bit

Operador Binario Función


<< Desplazamiento de bits a la izquierda
>> Desplazamiento de bits a la derecha

• Tabla de verdad de las operaciones AND, OR y X-OR


1&1=1 1 | 1 = 1 1 ^ 1 = 0
1&0=0 1 | 0 = 1 1 ^ 0 = 1
0 | 1 = 1 0 ^ 1 = 1
0&1=0
0 | 0 = 0 0 ^ 0 = 0
0&0=0

INFORMÀTICA 59
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Ejemplos:

0xF5 & 0x5A --> 0x50  11110101b AND 01011010b -> 01010000b

0xF5 | 0x5A --> 0xFF  11110101b OR 01011010b -> 11111111b

0xF5 ^ 0x5A --> 0xAF  11110101b XOR 01011010b -> 10101111b

~ 0xF5 --> 0x0A  NOT 11110101b -> 00001010b

0xF5 >> 2 --> 0x3D  11110101b >> 2 -> 00111101b

0xF5 << 2 --> 0xD4  11110101b << 2 -> 11010100b

INFORMÀTICA 60
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Para forzar bits a 0 se emplea el operador AND


– Sabiendo que X AND 0 = 0 y X AND 1 = X

– Por ejemplo, para conseguir que los tres bits de menor peso de una variable
var de tipo byte sean 0

b7 b6 b5 b4 b3 b2 b1 b0

AND 1 1 1 1 1 0 0 0

b7 b6 b5 b4 b3 0 0 0

• En C
unsigned char var;

var = var & 0xF8;

INFORMÀTICA 61
INDUSTRIAL
6. Operaciones con bits. Máscaras

• AND se puede usar para conocer si un bit está a 1 ó a 0


– P.e. Comprobar el valor del bit 12 de una variable var de tipo int

if (var & 0x1000) &


b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
printf(“Es 1”); 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

else 0 0 0 b12 0 0 0 0 0 0 0 0 0 0 0 0
printf(“Es 0”); Si b12 es “0” resultado 0x0000 (igual a cero) => FALSO en C
Si b12 es “1” resultado 0x1000 (distinto de cero) => VERDADERO en C

• AND se puede usar para extraer un grupo de bits


– P.e. Extraer el número binario de 3 bits contenido en los tres bits de menor
peso de una variable var &
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
int numero, var;
0 0 0 0 0 0 0 0 0 0 0 0 0 b2 b 1 b 0
numero = var & 0x7;
Ahora el valor decimal corresponde únicamente al valor de los 4 bits

INFORMÀTICA 62
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Para forzar bits a 1 se emplea el operador OR


– Sabiendo que X OR 0 = X y X OR 1 = 1

– Por ejemplo, para conseguir que los tres bits de menor peso de una variable
var de tipo byte sean 1

b7 b6 b5 b4 b3 b2 b1 b0

OR 0 0 0 0 0 1 1 1

b7 b6 b5 b4 b3 1 1 1

• En C
unsigned char var;

var = var | 0x7;

INFORMÀTICA 63
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Para complementar bits se emplea el operador X-OR


– Sabiendo que X XOR 0 = X y X XOR 1 = /X

– Por ejemplo, para complementar los tres bits de menor peso de una variable
var de tipo byte

b7 b6 b5 b4 b3 b2 b1 b0

XOR 0 0 0 0 0 1 1 1

b7 b6 b5 b4 b3 /b2 /b1 /b0

• En C
unsigned char var;

var = var ^ 0x7;

INFORMÀTICA 64
INDUSTRIAL
6. Operaciones con bits. Máscaras

• Los operadores >> y << equivalen a dividir o multiplicar por


potencias de 2
– Se pueden usar para componer / descomponer números

• P.e. Para separar un número de 16 bits en dos bytes

unsigned int dato;


b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0
unsigned char alto; unsigned char bajo;

Otra
alto = dato >> 8; forma alto = dato / 256;
bajo = dato & 0xFF; bajo = dato % 256;

INFORMÀTICA 65
INDUSTRIAL
6. Operaciones con bits. Máscaras

• P.e. Componer un número de 16 bits a partir de 2 bytes

unsigned char alto; unsigned char bajo;


b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0

b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0


unsigned int dato;

dato = alto;
dato = dato << 8;
dato = dato | bajo;
Otra
X
dato = alto << 8;
No sirve, se pierden los bits

forma
dato = alto * 256;
dato = dato + bajo;

INFORMÀTICA 66
INDUSTRIAL
Actividades

• Realizar las siguientes operaciones

10101001011010101010101010101010111b --> (hexadecimal)

0xAB & 0x03 -->

0xAB | 0x03 -->

0xAB ^ 0x03 -->

~ 0xAB -->

0xAB >> 2 -->

0xAB << 2 -->

INFORMÀTICA 67
INDUSTRIAL
Actividades

– Dada una variable valor de tipo unsigned char, escribir la expresión C


que ponga a 1 los 2 bits de mayor peso y a 0 los 2 bits de menor peso

– En los bit 10,9,8,7 de una variable int hay codificado un número binario
de 4 bits. Almacena su valor en una variable de tipo int y muéstrala por
pantalla usando printf()

– Componer en una variable de tipo unsigned char un dato de 8 bits a partir


de los nibbles (4 bits) contenidos en las variables de tipo unsigned int
ni_low y ni_high

Solución

INFORMÀTICA 68
INDUSTRIAL
Actividades
– Dada una variable valor de tipo unsigned char, escribir la expresión C que
ponga a 1 los 2 bits de mayor peso y a 0 los 2 bits de menor peso
unsigned char valor;
valor = valor | 0xC0;
valor = valor & 0xFC;

– En los bit 10,9,8,7 de una variable int hay codificado un número binario de 4
bits. Almacena su valor en una variable de tipo int y muéstrala por pantalla
usando printf()
int variable;
printf (“El valor de los 4 bits es: %d\n”, ((variable & 0x0780)>>7));

– Componer en una variable de tipo unsigned char un dato de 8 bits a partir de


los nibbles (4 bits) contenidos en las variables de tipo unsigned int ni_low y
ni_high
unsigned char dato;
unsigned int ni_low, ni_high, aux;
dato = ni_high & 0x0F;
dato = dato << 4:
aux = ni_low & 0x000F;
dato = dato | aux;

INFORMÀTICA 69
INDUSTRIAL
7. Bibliografía

[Kernighan1991] Brian W. Kernighan, Dennis M. Ritchie.


El lenguaje de programación C.
Ed. Prentice-Hall Hispanoamericana, 1991.

[Charte1998] Francisco Charte Ojeda. C++ Builder 3. Ed. Anaya, 1998

INFORMÀTICA 70
INDUSTRIAL

También podría gustarte