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

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

C örnek kodlar

Integer bir sayının bit değerlerini değiştirme, tersine çevirme ve değerlerini alma işlemleri

Aşağıdaki program, bg_bitopr() fonksiyonunu 3 farklı mod ile kullanarak, long integer bir sayının bit değerlerini değiştirme, tersine çevirme ve değerlerini alma işlemlerini gerçekleştirir. Fonksiyonun index parametresi işlem yapılacak bit'in sağ taraftan başlamak üzere sırasını gösterir. Fonksiyonun mode parametresi ise, 1 değeri aldığında bit'e 1 değerinin, 0 değeri aldığında bit'e 0 değerinin verileceğini, 2 değeri aldığında ise, bit değerinin tersine çevrileceğini gösterir. Herhangi bir sıradaki bit değerinin 0 veya 1 değeri aldığı bg_bitcheck() fonksiyonu ile kontrol edilir.


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

// Bit işlem fonksiyonu mode: 0 (0 değeri verme), 1 (1 değeri verme), 2 (0 ve 1 değeri arasında geçiş yapma)
long int bg_bitopr(long int val, int index, int mode);
// Bit değerini kontrol etme
int bg_bitcheck(long int val, int index);
// Unsigned long int değeri ikili sistemde yazma
void bg_IntToBin(long int val);

int main(void)
{
  long int lid1 = 121;       // 00000000 00000000 00000000 01111001
  long int lid2;

  bg_IntToBin(lid1);

  // 1 değeri verme (Sağ taraftan başlayarak 10.sıradaki bit)
  lid2 = bg_bitopr(lid1, 10, 1);  // 00000000 00000000 00000010 01111001 (633)
  bg_IntToBin(lid2);

  // 0 değeri verme (Sağ taraftan başlayarak 7.sıradaki bit)
  lid2 = bg_bitopr(lid2, 7, 0);   // 00000000 00000000 00000010 00111001 (569)
  bg_IntToBin(lid2);

  // Bit değerini tersine çevirme (Sağ taraftan başlayarak 12.sıradaki bit)
  lid2 = bg_bitopr(lid2, 12, 2);  // 00000000 00000000 00001010 00111001 (2617)
  bg_IntToBin(lid2);

  // Bit değer kontrolu
  printf("Bit değeri: %d", bg_bitcheck (lid2, 4) ? 1 : 0);

  return 0;
}

// Bit işlem fonksiyonu mode: 0 (0 değeri verme), 1 (1 değeri verme),  2 (0 ve 1 değeri arasında geçiş yapma)
long int bg_bitopr(long int val, int index, int mode)
{
    switch(mode) {
       case 0: // 0 değeri verme
            val = val & ~(1 << (index-1));
            break;
       case 1: // 1 değeri verme
            val = val | ( 1 << (index-1));
            break;
       case 2: // 0 ve 1 değeri arasında geçiş yapma
            val = val ^ (1 << (index-1));
            break;
    }

    return val;
}

// Bit değerini kontrol etme
int bg_bitcheck(long int val, int index)
{
    return ((val >> (index-1)) & 1);
}

// Unsigned long int değeri ikili sistemde yazma
void bg_IntToBin(long int val)
{
  int bitsayi = sizeof(val) * 8;   // Integer değerin bit adet değeri
  char *cdizi = (char*) 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("%lu: %s\n", val, cdizi);
  free(cdizi);
}

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

121: 00000000000000000000000001111001
633: 00000000000000000000001001111001
569: 00000000000000000000001000111001
2617: 00000000000000000000101000111001
Bit değeri: 1