28 Ocak 2010 Perşembe

Tümleme Programı

Sorumuz; Mesela elimizde 10010110 diye dizimiz olsun. İlk önce birleri sıfır; sıfırları bir yapıp(01101001) sonra ikilik sistemde bir ekleyen program yazalım. Sonuc 01101010 olacak.

C 'ye göre programımız;

char dizi[9];
int i=0,elde=1;

for(i=0;i<8;i++)
scanf("%d",&dizi[i]);

for(i=0;i<8;i++)
{
if(dizi[i]==0)
dizi[i]=1;
else dizi[i]=0;
}

for(i=0;i<8;i++)
printf("%d",dizi[i]);

for(i=7;i>-1;i--)
{
switch(elde)
{
case 0: if(dizi[i]==0)
{
elde=0;
dizi[i]=0;
} else
{
elde=0;
dizi[i]=1;
}
break;
case 1: if(dizi[i]==1)
{
elde=1;
dizi[i]=0;
} else
{
elde=0;
dizi[i]=1;
}
break;

}
}
printf("\n");
for(i=0;i<8;i++)
printf("%d",dizi[i]);

Not : Her zamanki gibi farklı ve daha basit yöntem ile çözülebilir.

3 yorum:

  1. Eğer her zaman 8 karakter uzunluğunda girdiler ile çalışacaksak yazdığınız kod bit-wise işlemlerle daha da kısalabilir bence. Yani okuduğumuz string'i bir adet char tipli değişkene yazarız. DAha sonra bu değeri 256 dan çıkarırsak 1'ler ve 0'lar yer değişmiş olur. Sonra buna a+=1; gibi basit bir toplama işlemiyle 1 ekleyip shift'leye shift'leye basabiliriz (<< veya >> operatörleriyle) :)

    YanıtlaSil
  2. tabi ki başka ve daha mantıklı yöntemlerle çözülebilir. Ben çok basitten alarak yazmıştım. Yeni başlayanlar daha rahat kavrasın diye. Ama yönteminiz güzel. Onu da deneyip yazayım.

    YanıtlaSil
  3. Bahsettiğim yöntemin kodunu http://snowy73.eu5.org/tmp/bitwise.c adresinden çekebilir merak edenler. Elimden geldiğince anlatamaya çalıştım kodu satır satır.

    Bir de ilgili arkadaşlar http://projecteuler.net/ adresinden kayıt olup bunun gibi problemleri çözmekle uğraşabilirler. Tavsiye ederim.

    YanıtlaSil