Konvertimi nga Binar në Decimal dhe anasjelltas në C

Të gjitha diskutimet që kanë të bëjnë me C apo C++ shkojnë këtu.
User avatar
Themelues
Posts: 711
Joined: Tue Jan 27, 2004 4:03 pm
Location: Prishtinë, Kosovë
PostPosted: Tue Aug 03, 2004 7:17 pm
Tung të gjithëve,

Ky postim synon të spjegoj me anë të shembujve në gjuhën programuese C konvertimin e numrave binar në decimal dhe anasjelltas.

Pikspari, për ata që nuk e dijnë, numrat binarë janë numrat të cilët përbëhen vetëm nga vlerat 1 dhe 0, përderisa numrat decimal janë numrat të cilat i përdorim cdo ditë p.sh. 1, 33, 224 etj.

Ky postim do të merret kryesisht me numra binar 8-bitësh (pra, 8 shifrorë), si dhe me numra decimal me vlerën maksimale 255 (më poshtë do të kuptoni pse është zgjedhur kjo vlerë).

Për të konvertuar një numër decimal në binar do të përdorim këtë listë: 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
Nëse p.sh. dëshirojmë të konvertojmë numrin 54, duke u bazuar në listën e lartëpërmendur, atëherë do të kemi:

128 -> 0
64 -> 0
32 -> 1
16 -> 1
8 -> 0
4 -> 1
2 -> 1
1 -> 0

Dhe kur e lexojmë këtë rezultat nga lartë poshtë do të kemi numrin binar: 00110110. Pra, 54 = 00110110.
Për t'a fituar këtë rezultat, vetëm është vendosur vlera 1 në numrat decimal që nevojitën për ti mbledhur për t'a fituar numrin 54. Pra, vlera 1 është vendosur tek numrat: 32, 16, 4 dhe 2, për shkak se 32 + 16 + 4 + 2 = 54.
Në rastë të konvertimit të numrit 255 në binar do të kemi:

128 -> 1
64 -> 1
32 -> 1
16 -> 1
8 -> 1
4 -> 1
2 -> 1
1 -> 1

Pra, 255 = 11111111, ku kjo është vlera maksimale për numër binar 8-bitësh.

Sa i përket konvertimit të numrave binar në decimal, për këtë do të përdorim listën: 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0
Pra, nëse bëhet konvertimi i numrit binar 10110111, atëherë në bazë të kësaj liste do të kemi:

1 -> 2^7 = 128
0 -> 2^6 = 0 (këtu vendoset 0 e jo 64 për shkak se vlera binare është 0)
1 -> 2^5 = 32
1 -> 2^4 = 16
0 -> 2^3 = 0 (e njejta rregullë vlenë sikurse tek vlera e dytë e vargut)
1 -> 2^2 = 4
1 -> 2^1 = 2
1 -> 2^0 = 1

Kur bëhet mbledhja e vlerave që janë fituar, do të kemi: 128 + 0 + 32 + 16 + 0 + 4 + 2 + 1 = 183. Pra, 10110111 = 183.

Duke u bazuar në mënyrat e lartëpërmendura të konvertimit nga binar në decimal dhe anasjelltas, do t'i kemi C skriptet në vijim.

Code: Select all
/*
Programi: Decimal-Binar.c
Pershkrimi i programit: Konvertimi i numrave decimal ne numra binar me kufizim 8 bitesh.

Autori: Genc Doko <gdk ET rrjeta PIKE net>
Data: 13 Korrik, 2004
*/

#include <stdio.h>

int main(){

   int numri_decimal, i;
   int tabela_konvertimit[ ] = {128, 64, 32, 16, 8, 4, 2, 1};
   
   printf ("Jepni vleren per numrin decimal qe doni te konvertoni: ");
   scanf ("%d", &numri_decimal);
   
   if (numri_decimal > 255){
      printf ("VEMENDJE! Ky program eshte i kufizuar ne konvertime maksimale 8 biteshe.\n");
   }
   else{
      printf ("Rezultati: %d = ", numri_decimal);

      for (i=0; i < 8; i++){
         if (numri_decimal >= tabela_konvertimit[i]){
            numri_decimal = numri_decimal - tabela_konvertimit[i];
         
            printf ("1");
         }
         else{
            printf ("0");
         }
      }
      
      printf ("\n");
   }

   return 0;
}


Pra, siq shihet kjo skriptë do të testoj se a është numri decimal i dhënë më i madhë se vlerat në matricën tabela_konvertimit[ ], dhe në rastë se kjo është e saktë, atëherë vlera në matricën e lartëpërmendur do të zbritet nga numri i dhënë, dhe rezultati do të ruhet në numrin e dhënë për t'u shfrytëzuar në testimin e ardhshëm. Poashtu i tërë ky hap do të thotë që vargu binar do të fitoj vlerën 1 në pozitën respektive apo në rast se numri i dhënë është më i vogël se vlera momentale në matricën e lartëpërmendur, vargu binar do të fiton vlerën 0 në pozitën respektive.

Skripta e lartëpërmendur përfshinë konvertimin e numrave decimal në binarë. Për konvertimin e numrave binar në decimal merret skripta e mëposhtme:

Code: Select all
/*
Programi: Binar-Decimal.c
Pershkrimi i programit: Ky program bene konvertimin e numrave nga binar ne decimal.

Burimet e shfrytezuara: Funksioni reverse() nuk eshte i shkruar nga autori. Ky funksion gjendet ne adresen http://www.info.ucl.ac.be/ingidocs/tutoriels/cornell/make/ex2/itoa.c

Autori: Genc Doko <gdk ET rrjeta PIKE net>
Data: 16 Korrik, 2004
*/

#include <stdio.h>
#include <math.h>
#include <string.h>

void reverse (char s[]);

int main(){

  char vargu_binar[32];
  int i, numri_decimal = 0;

  printf ("Jepni vleren per vargun binar qe doni t'a konvertoni: ");
  scanf ("%s", vargu_binar);

  reverse (vargu_binar);

  i = 0;
  while (vargu_binar[i] !='\0'){
    if (vargu_binar[i] == '1')
      numri_decimal = numri_decimal + pow (2, i);
    i++;
  }

  printf ("Rezultati (numri decimal): %d\n", numri_decimal);
 
  return 0;
}

void reverse (char s[])
{
  int c, i, j;
   
  for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
  {
    c = s[i];
    s[i] = s [j];
    s[j] = c;
  }
}


Në këtë skriptë, pjesa kryesore është:

Code: Select all
    if (vargu_binar[i] == '1')
      numri_decimal = numri_decimal + pow (2, i);


Kjo pjesë teston se a është vlera në vargun binar e barbartë me 1 dhe në rastë se kjo është e saktë, atëherë numrit decimal do t'i shtohet vlera e 2 në fuqinë e vlerës që ka pozita në të cilën gjendet vlera 1 në vargun binar. Pra, nëse vargu binar e ka vlërën 1 në pozitën e dytë atëherë do të kemi: 2^1 (pozita e parë është 0). Për të funksionuar kjo procedurë, vargu binar i dhënë duhet të kthehet mrapsht për shkak se nëse nuk bëhet kjo atëherë në rast se e kemi vlerën 1 në pozitën e parë të vargut binar do të kemi 2^0 në vend të 2^7.

Ky postim kishte për qëllim të spjegoj një nga mënyrat se si të bëhen konvertimet nga numrat decimal në binar dhe anasjelltas, dhe si të realizohen ato në gjuhën programuese C. Merreni parasyshë që mënyrat e lartëpërmendura nuk janë të vetmet.

Tung!
Last edited by gdk on Sun Aug 14, 2005 8:32 pm, edited 3 times in total.
Google është miku juaj.
Përparoni. Kontribuoni.
User avatar
Ditak
Posts: 299
Joined: Fri Sep 10, 2004 10:31 pm
Location: Genève, Suisse
PostPosted: Fri Sep 24, 2004 3:46 am
gdk pse kshtu? Kam nje ide, pse jo me i hi nje TOPIC edhe me e studiju mire edhe thelle edhe pastaj me shkru nje whitepaper mbi ate send ne shqip...postime te tilla ne forum jane te natyres "impermanent". Po mendoj forumet jane per biseda jo per artikuj. u agree?
--the-wolf-b29
User avatar
ish-Administrator
Posts: 295
Joined: Thu Jul 08, 2004 12:28 am
Location: Prishtine, Kosove
PostPosted: Fri Sep 24, 2004 10:55 am
Tung,

Forumet te cilat kane te bejne me Sigurine Kompjuterike siq bene Rrjeta.Net, gjate bisedes se shkembyer flasin vetem per ate drejtim. Ky forum nuk ka te beje me biseda te thjeshta "badihava", por ktu konsultohen programuesit, Windows perdoruesit, Linux perdoruesit, Hardware Services, te gjitha qka kane te bejne me boten kompjuterike.

Normal edhe kjo shkrese nga gdk, eshte plotesisht e ati lloji dhe edhe mjaft e arsyeshme per t'u postuar. Nuk po vazhdoj me fol per ata ma shume, por dua te them se administratoret, kujdestaret e te gjithe perdoruesit e ketij forumi, e pergezojne kur bejme shkembinim e informatave, pa marr parasysh se ky eshte vetem nje forum.

P.S. Mendimi im ah? :)

BassReFLeX

Outlaws & Angels
User avatar
Themelues
Posts: 711
Joined: Tue Jan 27, 2004 4:03 pm
Location: Prishtinë, Kosovë
PostPosted: Fri Sep 24, 2004 10:28 pm
wb29,

Ju kuptoj :) Do t'a marr këtë gjë në konsiderat për punimet e ardhshme.

Tung!
Google është miku juaj.
Përparoni. Kontribuoni.
User avatar
Ditak
Posts: 299
Joined: Fri Sep 10, 2004 10:31 pm
Location: Genève, Suisse
PostPosted: Sat Sep 25, 2004 2:41 am
BassReFLeX,

Ne asnje menyre nuk provova me nenqmu punen e gdk, kjo cka eshte e postume eshte shume send i mire, drejten me te than po me vjen mire qe gdk ka vendos kod ne C aty.

Ky forum nuk ka te beje me biseda te thjeshta "badihava", por ktu konsultohen programuesit, Windows perdoruesit, Linux perdoruesit, Hardware Services, te gjitha qka kane te bejne me boten kompjuterike.


Plotesisht pajtohem me kete!

Tregom Bass sa replies kan ardh ne keto threads? (keto me 0 qe jane) Cka eshte efekti i tyre? Pse jo me kriju nje paper te mire e me i postu ne sajta te ndryshem e me e lan forumin me ekzistu ne natyren e vet dhe natyrale qe e ka? Me fjale tjera ne vend se me pas 7 threads, pse jo 1 paper te mire?

Forumi eshte per biseda, dialog, si the ti, jo per dicka te till. Ka pytje (lexo: kerkesa) ne kete forum qe mbesin te pa pergjigjura.

Btw Bass, te lutem ma spjego ni send se nuk po ma kap fort, kur vjen puna te eksploitat qe punojne permes buffer overflow pse eshte e mundur ekzekutimi i kodit ne memorie vetem se buffer eshte tejkalu?? Po me kupton? Pse ekzekutohet qaj kod qe ehste pas buffer limitit?
--the-wolf-b29
User avatar
ish-Administrator
Posts: 295
Joined: Thu Jul 08, 2004 12:28 am
Location: Prishtine, Kosove
PostPosted: Sat Sep 25, 2004 10:32 am
wb29,

Pa marr parasysh qe ktu ska pase postime (replies), tema ka qene efektive edhe mendoj se "Views" duhet me u kqyr n'vend t'replies. Ska nevoj me ba faqe te vecant per kete, forumi eshte ktu. Edh btw nese bon faqe t'veqant, njerz si ti qi ankohen smujn mu anku n'ate faqe :). Smujna me i dit mendimet, efektin e senet qka postimi i ka ba ose ka ndihmu.

Sa i perket pytjes SATE ... rrotullohu dej qitu -> http://forum.rrjeta.net/viewtopic.php?t=43

BassReFLeX... bye!

Outlaws & Angels
User avatar
Ditak
Posts: 299
Joined: Fri Sep 10, 2004 10:31 pm
Location: Genève, Suisse
PostPosted: Sat Sep 25, 2004 4:51 pm
Flm shume per kujdes ;)
--the-wolf-b29

Return to C dhe C++

Who is online

Users browsing this forum: No registered users and 1 guest