[C con Clase] Dudas

Steven Davidson steven en conclase.net
Sab Feb 3 19:09:22 CET 2007


Hola Alejandro,

El pasado 2007-02-03 16:50:16, Alejandro escribió:

A> Hola, ya se que soy bastante pesado pero tenía otras dos dudas que os quería plantear:

No pasa nada; para eso estamos.

A> ¿Me podéis explicar los siguientes operadores mixtos?:  "<<=", ">>=", "&=", " ^=" y "|=". 

Estos operadores realizan operaciones a nivel de bit con la variable (a mano izquierda) y luego asignan el resultado a la misma variable. Por ejemplo,

unsigned char var = 100;

var <<= 2;
var &= 0x4f;
var ^= 0xcd;
var >>= 4;
var |= 12;

El comportamiento viene a ser el siguiente:

var = var << 2;
var = var & 0x4f;
var = var ^ 0xcd;
var = var >> 4;
var = var | 12;

No sé si tienes problemas con los operadores a nivel de bit. Sugiero repasar el capítulo dedicado a ellos en nuestro curso. Te interesa visitar el capítulo 18 yendo a: http://c.conclase.net/curso/index.php?cap=018

A> ¿Me podéis explicar en qué consiste el sugundo problema de las estructuras (el de las fechas). Es que no entiendo, básicamente, nada. Me gustaría que me explicarais el enunciado entero paso por paso.

Este ejercicio pide diseñar una estructura con campos de bits para representar una fecha: día, mes, y año. Podríamos hacer esto declarando un tipo de dato numérico fundamental para cada dato miembro. Por ejemplo,

struct fecha
{
  unsigned char dia;
  unsigned char mes;
  unsigned char anno;
};

Esto implica que cada fecha ocupa 3 bytes que equivalen a 24 bits. Si analizamos el intervalo de valores para cada campo o dato miembro, vemos que necesitamos menos bits para guardar cualquier valor para tales campos. En otras palabras, malgastamos bastante espacio. Para ajustar la cantidad de bits al mínimo, usaremos una estructura con campos de bits. Esto significa que necesitamos pensar en la cantidad de bits para asignar a cada campo. En el ejercicio, te damos una pista al decir que usaremos 'unsigned short'; o sea, 16 bits. Esto sería,

struct fecha
{
  unsigned short dia  : ¿?;
  unsigned short mes  : ¿?;
  unsigned short anno : ¿?;
};

Donde he puesto los signos de interrogación ¿? deberás poner la cantidad de bits que quieres asignar para cada campo. Recuerda que tenemos 16 bits en total.

Para este ejercicio, tendrás que hacer uso del artículo acerca de los "Sistemas de Numeración" que nos pediste en otro mensaje. También podrías analizar el problema usando matemáticas para determinar el exponente en base 2 para cubrir todos los posibles valores. Es una buena idea escribir las cantidades totales de posibles valores para cada campo en la estructura. Por ejemplo,

dia : {1,31}  => 31 valores  => X bits necesarios
mes : {1,12}  => 12 valores  => Y bits necesarios
año : {0,127} => 128 valores => Z bits necesarios


Espero haber aclarado las dudas.

Steven


Más información sobre la lista de distribución Cconclase