Programarea Calculatoarelor: Laborator 5

Scopul: lucrul cu operatori pe biți și înțelegerea reprezentării interne: căutarea anumitor tipare de biți dintr-un număr, extragerea unor biți consecutivi dintr-un număr, construirea unui număr din mai multe secvențe de biți.

Exemplu: citirea unui număr în octal

#include <ctype.h>
#include <stdio.h>

int read_oct(void)
{
  int c, n = 0;
  c = getchar();
  if (c != '0') return 0;	// trebuie prefix 0
  while (isdigit(c = getchar())) {
    if (c > '7') break;		// n-a fost cifra octala, gata.
    else n = (n << 3) | (c - '0');
  }
  return n;
}

int main(void)
{
  printf("%d\n", read_oct());
  return 0;
}
Exemplu: căutarea unui tipar de biți (11) într-un număr
#include <stdio.h>

// caută dacă n are cnt biti consecutivi cu tiparul patt
int bitsrch(unsigned n, int cnt, int patt)	
{
  int i;		// pozitia tiparului
  int m = (1 << cnt) - 1;	// tipar cu cnt de 1
  for (i = 0; n; ++i, n >>= 1)  // cat timp n != 0, nu s-au consumat toti bitii
    // la continuarea ciclului se incrementeaza i si deplaseaza n
    if ((n & m) == patt)	// s-a gasit tiparul pe ultimii cnt biti
      return i;		// returnează poziția curentă
  return -1;	// nu s-a găsit tiparul
}

int main(void)
{
  int pos = bitsrch(11, 3, 5);  // cauta tiparul de 3 biti 101 (5) in nr. 11
  if (pos >= 0) printf("tiparul s-a gasit pe pozitia %d\n", pos);
  else printf("tiparul nu s-a gasit");
  return 0;
}
Probleme propuse:
-- citirea sau tiparirea unui numar in octal/hexazecimal
-- numararea bitilor de 0 sau 1 dintr-un numar
-- gasirea unui tipar (ex. trei biti 1 consecutiv) intr-un numar
-- gasirea pozitiei celui mai (putin) semnificativ bit 0 sau 1
-- adunarea a doua numere bit cu bit
-- lucrul cu reprezentarea numerelor reale
Marius Minea
Last modified: Sun Mar 54 17:38:25 EET 2006