Code:
/* 2. Napisati funkciju koja na osnovu neoznacenog broja x formira nisku s koja sadrzi heksadekadni zapis broja x,
koristeci algoritam za brzo prevodjenje binarnog u heksadekadni zapis (svake 4 binarne cifre se zamenjuju jednom
odgovarajucom heksadekadnom cifrom). */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define broj_bitova 32
#define dimenzija_niske 32/4 + 1 // ukupan broj bitova delimo na celine od cetiri bita, a potom dodajemo jos jedan, za terminisucu nulu
void to_hex(unsigned int x, char s[]) {
unsigned int mask; // maska koja ce nam pomoci za dobijanje zeljenog bita
char c; // pomocni karakter koji cuva trenutni bit u vidu karaktera
mask = 1 << (broj_bitova - 1);
int i, j, suma;
for(i = 0;i<dimenzija_niske - 1;i++) { // idemo do terminisuce nule, odnosno karakter PRE nje
suma = 0; // postavimo sumu na nula, resetujemo je takoreci
for(j = 0;j < 4;j++) { // pomocna petljica, samo za manevrisanje u okviru cetiri bita
c = (mask & x ? '1' : '0'); // izvucemo bit iz x
suma += atoi(&c) * pow(2,3-j); // na sumu dodamo celobrojnu vrednost naseg karaktera, pomnozenu odgovarajucim stepenom broja 2 -> na taj nacin se prelazi iz binarnog u dekadni sistem
mask = mask >> 1; // pomerimo jedinicu jedno mesto u desno
}
s[i] = suma;
}
s[i] = '\0'; // i na kraju terminisuca nula, kako bi s uopste funkcionisalo kao niska
/* ne zaboravimo da prebacujemo u HEX dekadni sistem, znaci treba brojevima izmedju 9 i 16 dodeliti slovne oznake */
for(i = 0;s[i]!=0; i++) {
switch(s[i]) {
case 10 : s[i] = 'A'; break;
case 11 : s[i] = 'B'; break;
case 12 : s[i] = 'C'; break;
case 13 : s[i] = 'D'; break;
case 14 : s[i] = 'E'; break;
case 15 : s[i] = 'F'; break;
}
}
}
void pisi_nisku(char s[]) {
int i;
for(i=0; s[i]!=0; i++) {
putchar(s[i]);
}
}
/* pomocna funkcija koja ce ispisati bitove unetog broja x */
void pisi_bitove(unsigned int x) {
unsigned int mask = 1;
for(mask = 1 << (broj_bitova - 1);mask!=0;mask= mask >> 1)
putchar(x & mask ? '1' : '0');
putchar('\n');
}
int main(int argc, char argv[]) {
unsigned int x;
char s[dimenzija_niske];
printf("\nUnesite broj: ");
scanf("%d", &x);
to_hex(x, s);
printf("\nBinarni zapis unetog broja x je: ");
pisi_bitove(x);
printf("\nIsti broj u heksadekadnom zapisu je: ");
pisi_nisku(s);
putchar('\n');
return 0;
}
/* 2. Napisati funkciju koja na osnovu neoznacenog broja x formira nisku s koja sadrzi heksadekadni zapis broja x,
koristeci algoritam za brzo prevodjenje binarnog u heksadekadni zapis (svake 4 binarne cifre se zamenjuju jednom
odgovarajucom heksadekadnom cifrom). */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define broj_bitova 32
#define dimenzija_niske 32/4 + 1 // ukupan broj bitova delimo na celine od cetiri bita, a potom dodajemo jos jedan, za terminisucu nulu
void to_hex(unsigned int x, char s[]) {
unsigned int mask; // maska koja ce nam pomoci za dobijanje zeljenog bita
char c; // pomocni karakter koji cuva trenutni bit u vidu karaktera
mask = 1 << (broj_bitova - 1);
int i, j, suma;
for(i = 0;i<dimenzija_niske - 1;i++) { // idemo do terminisuce nule, odnosno karakter PRE nje
suma = 0; // postavimo sumu na nula, resetujemo je takoreci
for(j = 0;j < 4;j++) { // pomocna petljica, samo za manevrisanje u okviru cetiri bita
c = (mask & x ? '1' : '0'); // izvucemo bit iz x
suma += atoi(&c) * pow(2,3-j); // na sumu dodamo celobrojnu vrednost naseg karaktera, pomnozenu odgovarajucim stepenom broja 2 -> na taj nacin se prelazi iz binarnog u dekadni sistem
mask = mask >> 1; // pomerimo jedinicu jedno mesto u desno
}
s[i] = suma;
}
s[i] = '\0'; // i na kraju terminisuca nula, kako bi s uopste funkcionisalo kao niska
/* ne zaboravimo da prebacujemo u HEX dekadni sistem, znaci treba brojevima izmedju 9 i 16 dodeliti slovne oznake */
for(i = 0;s[i]!=0; i++) {
switch(s[i]) {
case 10 : s[i] = 'A'; break;
case 11 : s[i] = 'B'; break;
case 12 : s[i] = 'C'; break;
case 13 : s[i] = 'D'; break;
case 14 : s[i] = 'E'; break;
case 15 : s[i] = 'F'; break;
}
}
}
void pisi_nisku(char s[]) {
int i;
for(i=0; s[i]!=0; i++) {
putchar(s[i]);
}
}
/* pomocna funkcija koja ce ispisati bitove unetog broja x */
void pisi_bitove(unsigned int x) {
unsigned int mask = 1;
for(mask = 1 << (broj_bitova - 1);mask!=0;mask= mask >> 1)
putchar(x & mask ? '1' : '0');
putchar('\n');
}
int main(int argc, char argv[]) {
unsigned int x;
char s[dimenzija_niske];
printf("\nUnesite broj: ");
scanf("%d", &x);
to_hex(x, s);
printf("\nBinarni zapis unetog broja x je: ");
pisi_bitove(x);
printf("\nIsti broj u heksadekadnom zapisu je: ");
pisi_nisku(s);
putchar('\n');
return 0;
}