BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C örnek kodlar > c_ornek00001

C örnek kodlar

Integer değeri ikili sistemde yazma

Aşağıdaki program integer bir değeri ikili sayı sisteminde yazmak için 4 farklı fonksiyon kullanır. İlk fonksiyonda malloc() fonksiyonu ile bellek tahsisi yapılarak, ikinci fonksiyonda ise doğrudan karakter dizisinin başlangıç adresi fonksiyona geçirilerek, fonksiyonların bir karakter dizisi geri döndürmeleri sağlanır. Üçüncü fonksiyonda bellek tahsisi ve yazma işlemi fonksiyon içinde yapılır. Dördüncü fonksiyonda ise, işlemler fonksiyon içinde dizi kullanılarak yapılır. Üçüncü ve dördüncü fonksiyonlarda herhangi bir değer geri döndürülmez.


#include <stdio.h>
#include <stdlib.h>

char *IntToBin01(int val); /* Bellek tahsisi gerektirir. */
char *IntToBin02(int val, char *cdizi); /* Fonksiyona bir dizinin adresi atanır. */
void IntToBin03(int val); /* Bellek tahsisi ve yazma işlemi fonksiyon içinde yapılır. */
void IntToBin04(int val); /* İşlemler fonksiyon içinde dizi kullanılarak yapılır. */

int main(void)
{
  char *cdizi, cdizi2[100];
  int id = 179;

  printf("Sistem Integer byte büyüklüğü: %d bit büyüklüğü: %d\n", sizeof(int), sizeof(int)*8);

  cdizi = IntToBin01(id);
  printf("%d: %s\n", id, cdizi);
  free(cdizi); /* IntToBin01() fonksiyonunda malloc ile ayrılan belleği boşaltır. */

  printf("%d: %s\n", id, IntToBin02(id, cdizi2));

  IntToBin03(id);
  IntToBin04(id);

  return 0;
}

/* Bellek tahsisi gerektirir. */
char *IntToBin01(int val)
{
  int bitsayi = sizeof(val) * 8; /* Integer değerin bit adet değeri */
  char *cdizi = malloc(bitsayi+1); /* Dizi sonu '\0' karakteri için */
  cdizi[bitsayi] = '\0';
  /* En soldaki bit'in negatif değerler sorununu önlemek için unsigned değişken olarak işlem yapma */
  unsigned int u = *(unsigned int*)&val; /* u = val = 179 = 00000000 00000000 00000000 10110011 */
  // 1 sayısını bit genişliğinden bir düşük değer kadar sola kaydırarak 32 bit'in en soldaki bit'ini 1 diğer bitleri 0 yapar.
  unsigned int mask = 1 << (bitsayi-1);  /* 10000000 00000000 00000000 00000000 = 2.147.483.648 */
  int id;

  for (id=0; id<bitsayi; id++, mask >>= 1) {
      /* Döngü değişkeninin her artışında mask değerinin en solundaki 1 değeri bir sağa kayar */
      cdizi[id] = (u & mask) ? '1' : '0';
  }

  return cdizi;
}

/* Fonksiyona bir dizinin adresi atanır. */
char *IntToBin02(int val, char *idizi)
{
  int bitsayi = sizeof(val) * 8;
  unsigned int u = *(unsigned int*)&val;
  unsigned int mask = 1 << (bitsayi-1);
  int id;

  for (id=0; id<bitsayi; id++, mask >>= 1) {
      idizi[id] = (u & mask) ? '1' : '0';
  }
  idizi[id] = '\0';

  return idizi;
}

/* Bellek tahsisi ve yazma işlemi fonksiyon içinde yapılır. */
void IntToBin03(int val)
{
  int bitsayi = sizeof(val) * 8; /* Integer değerin bit adet değeri */
  char *cdizi = malloc(bitsayi+1); /* Dizi sonu '\0' karakteri için */
  cdizi[bitsayi] = '\0';
  /* En soldaki bit'in negatif değerler sorununu önlemek için unsigned değişken olarak işlem yapma */
  unsigned int u = *(unsigned int*)&val; /* u = val = 179 = 00000000 00000000 00000000 10110011 */
  // 1 sayısını bit genişliğinden bir düşük değer kadar sola kaydırarak 32 bit'in en soldaki bit'ini 1 diğer bitleri 0 yapar.
  unsigned int mask = 1 << (bitsayi-1);  /* 10000000 00000000 00000000 00000000 = 2.147.483.648 */
  int id;

  for (id=0; id<bitsayi; id++, mask >>= 1) {
      /* Döngü değişkeninin her artışında mask değerinin en solundaki 1 değeri bir sağa kayar */
      cdizi[id] = (u & mask) ? '1' : '0';
  }

  printf("%d: %s\n", val, cdizi);
  free(cdizi);
}

/* İşlemler fonksiyon içinde dizi kullanılarak yapılır. */
void IntToBin04(int val)
{
  char cdizi[100];
  int bitsayi = sizeof(val) * 8;
  unsigned int u = *(unsigned int*)&val;
  unsigned int mask = 1 << (bitsayi-1);
  int id;

  for (id=0; id<bitsayi; id++, mask >>= 1) {
      cdizi[id] = (u & mask) ? '1' : '0';
  }
  cdizi[id] = '\0';
  printf("%d: %s\n", val, cdizi);
}

Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:

Sistem Integer byte büyüklüğü: 4 bit büyüklüğü: 32
179: 00000000000000000000000010110011
179: 00000000000000000000000010110011
179: 00000000000000000000000010110011
179: 00000000000000000000000010110011