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