March 17, 2012

Sanırım projeye bu konu altından devam ediyorsunuz. Bu konularda çok acemi olduğumu belirtmiştim ama Salih'in yazdıklarını okuduktan sonra dayanamadım ve elimden geldiğince katkı sağlamaya karar verdim. Neticede amaç öğrenmek :)

Bende Ali'nin önceki mesajlarında maskeleme hakkında yaptığı tesbite katılıyorum ve MaskeYap() veya MaskeHazirla() isimli bir metoda ihtiyaç olduğunu düşünüyorum. Böylece bitBul() metodu hem daha sade hale gelecek hemde direk görevine odaklanacaktır. Ayrıca bunun ileride yazılacak unittest bloklarını hazırlarkende daha uygun olacağını düşünüyorum.

Ben bir şeyler yapmaya çalıştım ama tam olarak anlayamadığım için bir neticeye ulaşamadım.

..
immutable mx = ulong.sizeof * 8;        // data max
..
int uzunluk = cast(int)arananBitler;
size_t kafa, maske = 1;

for(int i = 1; i <= mx; i++)
   {
       maske |= maske << 1;
       uzunluk >>= 1;
       if(uzunluk == 0)
       {
           writefln("uzunluk  : %s", uzunluk);
           writefln("i  : %s", i);

           maske >>= 1;
           uzunluk = i;
           break;
       } // MSB bitleri 0 olana kadar devam et, önceki duruma dön ve çık
   } // maske'yi doldur ve uzunluk'tan bir bit çıkar

..

Bu kod yani for döngüsünü içini kastediyorum, tam olarak ne iş yapıyor. Satır satir anlatabilir misiniz?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 17, 2012

Evet, size_t'de bir yanlış anlama var.

Alıntı (Salih Dinçer):

>

size_t: "Derleyicinin, sistem kaynaklarına ve kodun işleyişine göre karar verdiği (tanımladığı) bir veri türüdür."

Sistem kaynakları deyince bellek miktarı gibi bir kavram anlaşılabiliyor. size_t'nin sistemle öyle bir ilgisi yoktur.

Kodun işleyişi derken de çalışma zamanı ile ilgili bir kavramdan bahsediyorsan o da olamaz. Hatırlarsak, D derlemeli bir dil olduğundan bütün türler derleme sonunda bellidir. (Aslında kod işlemeye başladığında tür diye bir kavram kalmamıştır; ama konuyu dağıtıyorum.)

size_t'nin ne olduğunu sana bir soru sorarak anlatayım. Dizi gibi işleyen bir yapı tasarlıyorsun:

struct Dizi
{
   /* ... */

   BuTürNedir uzunluk()
   {
       /* ... */
   }
}

uzunluk() işlevinin dönüş türü nedir? Nasıl karar verirsin? Öyle bir tür olmalı ki bu sistemdeki bütün adet kavramlarını temsil edebilmeli.

Veya derleyici tarafından yanıtlayalım: Derleyici şu döngüde i'nin türünü ne seçmelidir?

   foreach (i; 0 .. 10) {
       /* ... */
   }

10 yerine int.max yazsam? uint.max yazsam? Bunlara göre farklı tür mü seçmelidir? Ama öyle yapsa döngü içinde benim kodlarım farklı işleyebilir. Programcı olarak orada bir garanti beklerim.

Sonuçta şöyle karar verilmiş: programın derlendiği sisteme uygun bir tür seçelim ve onun adına size_t diyelim. Program adet ve indeks gibi kavramları temsil ederken hep size_t yazarsa hiçbir yerde sorun kalmaz.

Ayrıca bu türün işaretsiz bir tür olduğunu da garantileyelim. Yoksa programcı örneğin 64 bitlik bir sistemde belleğin uzunluğunu bile söyleyemez. 64 bitlik sistemde 2 üzeri 64 adet adres bulunabildiğine göre size_t'yi long seçsek yalnızca yarısını söyleyebiliriz.

size_t, programın derlendiği anda belirlidir ve uygun bir işaretsiz bir türdür. Her ne kadar "uygun bir türdür" diye fazla serbest konuşuyorsam da 32 bitlik sistemlerde uint'in, 64 bitlik sistemlerde de ulong'un eşdeğeri olduğu neredeyse kesindir.

Neyin takma ismi olduğunu /usr/include/d/dmd/druntime/import/object.di dosyasında görüyorum:

alias typeof(int.sizeof)                    size_t;

Demek ki aslında karar daha derinlerden geliyor: derleyici o sistemde .sizeof'un türü olarak neyi seçmiş ise ona size_t diyoruz.

Programcının yapması gereken son derece basit: size_t, adet veya indeks gibi kavramların türüdür. .length, .sizeof, öğrenciAdedi(), çekirdekAdedi(), vs. hep size_t türünde seçilmelidir. O tarafı bu kadar basit.

Öte yandan size_t, bu programdaki veri için hiç uygun değildir. Çünkü verimiz adet değil, indeks değil. Bitleri ile ilgilendiğimiz değişkenlerle ilgileniyoruz.

Yan not: size_t'nin işaretsiz bir tür olmasının getirdiği bir sakınca vardır. Eksi değer taşıyamadığından çıkarma işleminde kullanıldığında yanlış sonuç verebilir: i-j dendiğinde j daha büyük değer ise i ile j arasındaki uzaklığı elde etmemiş oluruz. Çıkarma işleminde kullanmaya uygun tür sizediff_t'dir çünkü o işaretli bir türdür.

Alıntı:

>

Kullanma sebebim ise; aranan veri ile verinin kendisinin değişebilirliliği. Yani veriler[] dizi en küçük ubyte olabilir ama dilediğimizde sınıf veya işlevde değişikliğe gitmeden diğer veri türleri de kullanılmalıdır.

"İşlevde değişikliğe gitmeden" derken derleyicinin değişiklik yapmamasından bahsediyorsan bu olanaksızdır. Sonuçta işleyen makine kodu tam da o türe uygun yazmaçlarla vs. derlenmiştir. Türe karar verilmiştir.

Eğer programcının değişiklik yapmamasından bahsediyorsan o zaman ya işlev yükleme (overloading) olanağından yararlanarak her tür için farklı işlev yazmak zorundasın, ya da bunun güçlüğünü farkettiğinde şablon yazmalısın.

Başka bir seçeneğin de verinin türünü örneğin ulong seçmek ve olayı bitirmektir. D'nin tamsayı türlerinin bit sayılarının belirli olması yararlı. ulong'un her zaman 64 bit olduğunu biliyoruz. Ek olarak şunlar da var:

http://dlang.org/phobos/std_stdint.html

O türler sanıyorum C'ye sonradan eklenen tür isimlerinin aynıları.

Alıntı:

>

İşte bu yüzden yan anlam olarak da şunu zannediyorum:

"...işlevde kullanılırken bağlandığı veri türü ubyte ise temsil eden size_t de ubyte olur" mu?

Bu noktaya kadar anlaşılmıştır ama, hayır ubyte olmaz. Kullanılırken bağlandığı tür istiyorsan şablon yazman gerek. D şablon kolaylığı konusunda inanılmayacak kadar kolay.

Alıntı:

>

Ayrıca aranılan veri türü üç bit de olabileceği gibi 64 bit de olabilir. O yüzden size_t kullanmıştım.

İşte o zaman ya ulong kullanmalısın veya yukarıdaki sayfadaki ismi daha açık olan uint64_t'yi. Belki de en büyük tamsayı türü anlamına gelen uintmax_t'yi. Onun tanımı da şurada:

/usr/include/d/dmd/druntime/import/core/stdc/stdint.di

Görüldüğü gibi o da zaten ulong:

   alias ulong uintmax_t;

Eğer ucent sonunda gerçekleştirilirse belki de ucent olur. (?)

Alıntı:

>

Yine yukarıdaki gibi aynı mantıkla, xKelime değişkenini ulong olarak tanımlarsam derleyici de size_t'li işlevleri de ulong yapıyor olabilir mi?

Senin ilacın şablon! ;)

Alıntı:

>

Eğer yukarıda şüphelendiğim gibi yanılgı içindeysem size_t'leri tam anlamıyla öğrenene kadar kullanmamalıyım...:)

Bence adet ve indeks kavramları için size_t kullan. Çıkarma işleminde sonucun çok büyük çıkabileceğini de aklında tut.

Şimdi sana bit işlemleri ile ilgilenen küçük bir şablon yazayım. İşine yarayıp yaramayacağına veya zor olup olmadığına sen karar ver:

import std.stdio;

/**
* Verinin en üst ve en alt dört biti dışındaki bitlerinin
* sıfırlanmışını döndürür.
*/
T ortasıSıfırlı(T)(T veri)
{
   /* Not: Aşağıdaki üç değişkenin başına enum yazmak daha
    * uygun olur. Örneği bulandırmamak için öyle yazmadım. */
   size_t toplamBit = veri.sizeof * 8;
   T altBitlerMaskesi = 0b1111;
   T üstBitlerMaskesi = cast(T)(altBitlerMaskesi << (toplamBit - 4));
   /* Yukarıdaki cast'e neden gerek olduğunu yazı içinde
    * anlatıyorum. */

   return veri & (altBitlerMaskesi | üstBitlerMaskesi);
}

/*
* 101010... deseninde belirtilen türde değer döndürür.
*/
T birSıfır(T)()
{
   return cast(T)(0xaaaa_aaaa_aaaa_aaaa);
}

void main()
{
   ubyte  b = birSıfır!ubyte();
   ushort s = birSıfır!ushort();
   uint   i = birSıfır!uint();
   ulong  l = birSıfır!ulong();

   writefln("%b => %b", b, ortasıSıfırlı(b));
   writefln("%b => %b", s, ortasıSıfırlı(s));
   writefln("%b => %b", i, ortasıSıfırlı(i));
   writefln("%b => %b", l, ortasıSıfırlı(l));
}

Çıktısı:

'10101010 => 10101010
1010101010101010 => 1010000000001010
10101010101010101010101010101010 => 10100000000000000000000000001010
1010101010101010101010101010101010101010101010101010101010101010 => 1010000000000000000000000000000000000000000000000000000000001010
'

Şablonun karışıklıkları şunlar:

  • İşlev şablonunun iki parantezi oluyor. Birinci parantez, T'nin bir tür olduğunu ve programdaki kullanıma göre derleyici tarafından seçileceğini bildiriyor. (Çalışma zamanından çok önce.)

  • İşlevin geri kalanında o tür ne ise onun yerine T yazıyoruz.

ortasıSıfırlı() işlevinde cast kullanmak zorunda kaldım. Bu, "integer promotions" (bazen "integral promotions" da diyorlar) yüzündendi. Şurada "Integer promotions" başlığında:

http://dlang.org/type.html

C'ye dayanan kurallara göre << gibi işlemler ya int ya da uint türü ile yapılırlar. Yani T ubyte bile olsa << işleminin kendi türü int oluyor. int'i de üstBitlerMaskesi değişkenine cast'siz atayamıyoruz.

Çok önemli bir hatırlatma daha: şablonların sihiri de derleme zamanındadır. Derleyici, programda kullandık diye tam dört tane ortasıSıfırlı() işlevi oluşturur. Bunların makine kodları kullandığımız dört türe göredir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 18, 2012

Hocam, yazdıklarını az önce okudum; asıl cevabımı vermeden önce ve yeni yanlış anlamalara dallanmadan evvel, 'oku_ve_Anla()' işlevini bir döngü içinde (sayısı belirsiz, size_t diyelim!) bir kaç defa işletmeliyim...:)

Ancak çok çok yararlı olduğunu da belirtmeliyim, teşekkürler...

Alıntı (Zafer Çelenk):

>
> ...
> 0.	immutable mx = ulong.sizeof * 8;        // data max
> ...
> 1.	int uzunluk = cast(int)arananBitler;
> 2.	size_t kafa, maske = 1;
>
> 3.	for(int i = 1; i <= mx; i++) {
> 4.	        maske |= maske << 1;
> 5.	        uzunluk >>= 1;
> 6.	        if(uzunluk == 0) {
> 7.	            maske >>= 1;
> 8.	            uzunluk = i;
> 9.	            break;
>         } // MSB bitleri 0 olana kadar devam et, önceki duruma dön ve çık
>     } // maske'yi doldur ve uzunluk'tan bir bit çıkar
> ...
> ```

> Bu kod yani for döngüsünü içini kastediyorum, tam olarak ne iş yapıyor. Satır satir anlatabilir misiniz?
>
Zafer'in sorduğu koda gelince; yanlarına satır numaraları verdim ve elimden geldiğince ifade etmeye çalışacağım inşaallah:

**0. satır:** Aslında bir yanlış anlamalar zincirinin bir ürünü. Ancak sabit (const) değişmeyen bir sayı ürettiğini ve bunun değerinin 64 olduğunu belirtmeliyim. Özetle ulong kaç bytlık bir sayı olduğunu soruyoruz ve 8 ile çarparak içine alabileceği (maskeleme yapabileceğimiz) en fazla değeri öğreniyoruz.

**1. satır:**İşlevin dönüş değer int olduğu için bu türe yerleştiriyoruz. Belki işaretli bir değer olduğu için yanlış yapıyor olabilirim. Ancak ihtiyacım olan bir kopyasını almaktı çünkü onu ilerleyen satılarda değiştirip (her seferinde ikiye bölüp) etkin bir şekilde kullanacağız.

**2. satır:**İse bizim diğer çok çok etkin değişkenlerimiz. Özellike maske'yi 1'e eşitledim ki her defasında sola kaydırdığımızda maskenin sınırı belli olsun. Yoksa bu değişkene 0 olsaydı 4. satırdaki işlemde maskemiz her seferinde 0 olmaya mahkum olacaktı.

**3. satır:**Bizim bir taşla (döngüyle) iki kuş vurduğumuz bir bölümün başlangıcı. Yaptığı ise 1'den 64'e kadar saymak.

**4. satır:**Aslında iki satır ve benim her şeyi sıkıştırma alışkanlığımın bir ürünü. Yani derleyici imkan verdiği ölçüde ben bunu hep yapıyorum, n'apayım can çıkarmış huy çıkmazmış...:)

Açılımı ise şu:

maske = maske << 1; //Tüm bitleri sola kaydır, ilk durumda: 1 [0001] idi, 2 [0010] oldu...
maske = maske | 1; //Başına bir ekle, ilk durumda: 1 [0001] idi, 3 [0011] oldu...


Gerçi tam karşılığı sayılmaz çünkü yukarıda iki adet 1 değeri var. Ancak şöyle de izah edilebilir, kendisinin bir kopyasını sola kaydır ve sonra kendisiyle OR'la. Bu ROT (rotate) komutunun bir benzeri ama CF (carry flag) değili (invert). Yani CPU'da bu tür işlemler yapılırken 8 bit dışında bazı bitler (register'lar) vardır. Bunlardan biri STATUS ise (aslında o da bir değişken) içinde bir bayrağın ismi CF. O halde bu kaydırma işlemi yapılırken dışarıdan 1 değerini adeta açığa çıkarıyoruz.

Görsel olarak ise şöyle:

'[.... 0001]1 <-dışarıdaki CF bayrağı gibi düşünülebilir...
[...0 0011]1 <-dışarıdaki içeriye girdi ama hala CF bayrağı değişmedi...'

-devam edecek-

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
March 18, 2012

**5. satır:**Tam olarak ikiye bölmekte ve yine artizlik olsun diye :) kaydırma işlemini uyguladık. Yani ikiye de bölebilirdik çünkü değişken float veya double olmadığı için bize tam sayı verecektir. Madem bit üzerinde işlemler yapıyoruz, yakıştığı da bir gerçek! Zaten alt satırda sorguladığımız amaç ile doğru orantılı...

**6. satır:**İse en basit manasında 0 olup olmadığı kontrol ediyoruz. Ama gerçekte sağa kaydırma işlemi sırasında değişkende artık 1 kalıp kalmadığını sorguluyoruz. Böylece kaç adetlik maske yapmam gerektiğini, işleve ayrı bir parametre göndermeden tespit ediyoruz.

**7. satır:**Aslında bu satıra da gerek yok hani. Yani sorguyu yukarı alıp maske üzerinde yaptığımız işlemi de aşağıya alırsa alın size bir satır (belki de 2 satır) daha kazanmış olduk. Küme bitim parantezinin yanındaki açıklamada belirttiğim gibi, önceki duruma dönüyoruz, yani fazladan kaydırdığımızı geri alıyoruz.

**8. satır:**Hatırlarsan bir taşla iki kuş vurduğumuzdan bahsetmiştik. Maskeyi oluştururken uzunluk değerini de elde ettiğimiz için döngü adeti bize işlem yapılacak verinin uzunluğunu veriyor. İşte bu satırda artık önemi kalmamış (0 olmuş) değişkeni ileride kullanmak için atama yapıyoruz. Belki daha akıllı bir kodlama ile bu satırı bile kaldırabiliriz...:)

**9. satır:**Belki bu satırı açıklamaya gerek yok ama burada belirtmek uygun olacak. Döngü en fazla 64 defa devam edebilir. Aslında şimdi aklıma geldi, biz buraya sonsuz döngü koyabiliriz de! Çünkü farz edelim ilerde 128 bitlik işlemciler çıktı ve bit işleme değeri arttı. Zaten gelen verinin uzunluğuna göre bir sınırlama (sorgula ve çık) yaptığımıza göre 64 bit değerini immutable yapıp oraya aktarmak son derece gereksizmiş...

Özetle, yine Zafer sayesinde bir gerçeğin daha farkına vardım. Tabi Ali hocamın bahsettikleri ile kod daha kararlı olacağına eminim. Belki biz Türkler'in yaptığı ve tüm dünyada kullanılabilecek bit işleme sınıfının temellerini atıyoruz. Tabi şu ana kadar yaptıklarımız sanki beyin fırtınası gibi. Sanırm birlikte daha çok kod yazıp daha iyi bir düzene otursak farklı dillere de çevirip hoş bir ürün ortaya çıkarabiliriz. Özellikle söylüyorum altında bir Türk imzası olması önemli. Çünkü çevremiz hep bütün dünyadan karıncaların (karınca gibi çalışan yabancıların) yaptığı ürünler ile dolu; çok çalışkan olmalıyız!

Dip Not: Bu vesile ile araya bir görüşümü sıkıştırmak istiyorum. Gelecekte Türkiye, dünyanın yazılım sektörünün kalbi haline gelebilir. Tamam, Hindistan'da ben doğmadan evvel başlayan ve şu an doruk noktasında olan bir sektör var ama peki ya kalite? İnanıyorum ki Türkiye'de daha kaliteli kodlar üretecek bir nesil yetişiyor. Bence bizim hızlı çalışan kodlara ihtiyacımız var, süper hızlı bilgisayarlara değil!

Başarılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 18, 2012

Artık size_t'yi tıpkı sizeof'u anladığım gibi daha iyi anlamaya başladım; Ali hocam sayesinde...

Ancak henüz esnek bir yapı için çözüm bulmuş değilim...:)
Alıntı (acehreli:1331987020):

>

Evet, size_t'de bir yanlış anlama var.

Alıntı (Salih Dinçer):

>

size_t: "Derleyicinin, sistem kaynaklarına ve kodun işleyişine göre karar verdiği (tanımladığı) bir veri türüdür."

Sistem kaynakları deyince bellek miktarı gibi bir kavram anlaşılabiliyor. size_t'nin sistemle öyle bir ilgisi yoktur.

Kodun işleyişi derken de çalışma zamanı ile ilgili bir kavramdan bahsediyorsan o da olamaz. Hatırlarsak, D derlemeli bir dil olduğundan bütün türler derleme sonunda bellidir. (Aslında kod işlemeye başladığında tür diye bir kavram kalmamıştır; ama konuyu dağıtıyorum.)
Benim asıl bahsetmek istediğim tıpkı işlevleri "overload" yapmamız gibi derleme anında kodun işleyişi neyi ön görüyorsa o işlevi kullanmaya karar verdiğiydi. Gerçi artık size_t üzerine böyle bir görev yüklenemediğini öğrenmiş olduk. Ama ne iyi olmaz mıydı; "overload" olayının değişkenler üzerinde de uygulanabilmesi. Tabi şablon olayları ile çözebiliriz ki hocam bunu belirtmiş.

Şimdi çözüm üzerine çalışıyorum...
(bir yandan 'oku_ve_Anla()' işlevi arkaplanda çalışıyor ama)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 18, 2012

Alıntı (Salih Dinçer):

>

Ama ne iyi olmaz mıydı; "overload" olayının değişkenler üzerinde de uygulanabilmesi. Tabi şablon olayları ile çözebiliriz ki hocam bunu belirtmiş.

İşlev yükleme (overloading) de derleme zamanında halledildiği için değişken değerlerini de derleme zamanında seçebiliriz. Örneğin şu programdaki S yapısı her tür ile kullanılabiliyor ama herhangi bir nedene bağlı olarak içindeki dizinin eleman adedini o türe göre farklı seçebiliyor:

import std.stdio;

template UygunAdet(T)
{
   static if (T.sizeof <= 2) {
       enum size_t UygunAdet = 10;

   } else {
       enum size_t UygunAdet = 500;
   }
}

struct S(T)
{
   T[UygunAdet!T] elemanlar;
}

void main()
{
   S!byte sb;
   S!int  si;

   writeln(sb.elemanlar.length);
   writeln(si.elemanlar.length);
}

Çıktısı:

'10
500
'

Değerlerin yüklenmeleri çalışma zamanı çok şekilliliğinde (polymorphism) bulunmaz. O gibi durumlarda üst sınıf alt sınıfın o değeri sunmasını talep edebilir:

import std.stdio;

class ÜstSınıf
{
   void birAlgoritma()
   {
       writeln("Alt sınıftan öğrendiğim veri: ", özelVeri());
   }

   // Bunun tanımını burada veremiyoruz; alt sınıfların
   // sorumluluğuna bırakıyoruz.
   abstract int özelVeri();
}

class BirAltSınıf : ÜstSınıf
{
   override int özelVeri()
   {
       return 42;
   }
}

class BaşkaAltSınıf : ÜstSınıf
{
   override int özelVeri()
   {
       return 43;
   }
}

void main()
{
   ÜstSınıf[] nesneler;
   nesneler ~= new BirAltSınıf;
   nesneler ~= new BaşkaAltSınıf;

   foreach (nesne; nesneler) {
       nesne.birAlgoritma();
   }
}

Çıktısı:

'Alt sınıftan öğrendiğim veri: 42
Alt sınıftan öğrendiğim veri: 43
'

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 19, 2012

Salih detaylı ve güzel açıklama için teşekkür ederim. Ancak sanırım senin başını biraz daha fazla ağrıtacağım. Önceki mesajlarımda da belirttiğim gibi bu konularda gerçekten tecrübem yok. Kodları anlıyorum ama kavramak zor oluyor. Senin yazdığın maddeler üzerinden sırası ile aklıma takılanları yazayım. Cevaplarsan sevinirim.

Alıntı (Salih Dinçer:1332056894):

>

**1. satır:**İşlevin dönüş değer int olduğu için bu türe yerleştiriyoruz. Belki işaretli bir değer olduğu için yanlış yapıyor olabilirim. Ancak ihtiyacım olan bir kopyasını almaktı çünkü onu ilerleyen satılarda değiştirip (her seferinde ikiye bölüp) etkin bir şekilde kullanacağız.

Şimdi bu noktada aklıma takılan sorular var. öncelikle size_t olayından başlayalım. Ali şöyle demiş;

Alıntı:

>

Sonuçta şöyle karar verilmiş: programın derlendiği sisteme uygun bir tür seçelim ve onun adına size_t diyelim. Program adet ve indeks gibi kavramları temsil ederken hep size_t yazarsa hiçbir yerde sorun kalmaz.

Ayrıca bu türün işaretsiz bir tür olduğunu da garantileyelim. Yoksa programcı örneğin 64 bitlik bir sistemde belleğin uzunluğunu bile söyleyemez. 64 bitlik sistemde 2 üzeri 64 adet adres bulunabildiğine göre size_t'yi long seçsek yalnızca yarısını söyleyebiliriz.

Dolayısıyla bitBul() metodundaki arananBitler değişkeninin değeri uint veya ulong tipinden biri olmak durumunda, bu durumda örneğin 2_148_000_000 gibi bir sayi ile '"int uzunluk = cast(int)arananBitler;"' işlemini yaparsak ne olur? Böyle bir sayi gelir mi bilmiyorum tabi. Ayrıca madem int'e çevireceksek neden parametreyide int almayalım? Engel nedir?

Diğer bir konu ise uzunluk değerini neden ikiye bölüyoruz. Ayrıca uzunluk biraz kapalı bir isimlendirme olmuş sanırım, tam olarak kimdir bu uzunluk?

Alıntı:

>

Maskeleme
Bazı kütüphanelerde ve sistemlerde belirli bir tamsayı değer içine birden fazla bilgi yerleştirilmiş olabilir. Örneğin 32 bitlik bir değerin üst 3 bitinin belirli bir anlamı ve alt 29 bitinin başka bir anlamı bulunabilir. Bu veriler maskeleme yöntemiyle birbirlerinden ayrılabilirler.

Son olarak yukarıda maskeleme işlemi ile ilgili açıklamaya dikkat çekmek istiyorum. Görüldüğü üzere maske işlemi aslında uzun bir değerin içindeki farklı değerleri ayırştırmak için kullanılıyor. Oysa bizim int, short, veya long tipindeki verilerimizin tüm bitleri bu tip için ayrılmış değil midir? Yani int tipinde bir değişkende 32 bitin tamamı o int değeri için ayrılmış olmaz mı? Dolayısıyla bu maskeleme ile bizim yapmak istediğimiz tam olarak nedir?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 19, 2012

Tersten yanıtlayayım:

3-Maskelemeyi yapmamızın ana nedeni arama sonucunun doğru çıkması. Çünkü biz bitler üzerinden işlem yapıyoruz. Zaten byte gibi değeri sabit olan verimiz olsaydı eşit aralıklarda bir şeyi aramak daha kolay olurdu. Eğer aradığımız 0b1001 gibi 4 bitlik bir değer ise ve biz bunun sol bölümünü (MSB) silmezsek bu durumda 0b1001_1001 gibi bir değeri atlamış oluruz.

2-Ali hocamın bit işlem üzerine yazdığı harika dersi ara sıra okursan sanırım aklındaki bir çok soru kendiliğinden giderilecek. Çünkü orada da sağ kaydırmanın tam sayı cinsinden ikiye bölmek demek olduğu belirtilmiş. Yani biz matematiksel işlem yapmaktan çok bitleri teker teker dışarıya öteleyerek sayım gerçekleştiriyoruz.

1-Aslında bu bölümün esnek olması gerekir mi emin değilim. Yani en büyük değeri alıp tüm tür dönüştürme ve seçme işlemlerinden uzaklaşabiliriz. Kodu yazarken örneğin 4 bitlik veriyi 64 bit üzerinden aktarmak anlamsız gelmişti. O yüzden böyle değişkenler arasında bir seçimlilik (overloading) yapmak iyi olabilir.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 19, 2012

Ben tekrar düzgün sırada devam edeyim :)

3 -> 1. Tamam ve şu soruyu sormak zorundayım. Biz eğer 0b_1001 (9) gibi 4 bit bir veri arıyorsak neden kafa mekanizması veri şeridinden her defasında 4 bit okumuyor. Bunu engelleyen nedir?

Senin önceki mesajlarından da aklımda kalanları toplarlamak gerekirse ben veriyi 1 ve 0'lardan oluşan uzun bir şerit gibi düşünmüştüm kafa ise bizim istediğimiz ölçülerde genişleyen veya daralan bir kol diye aklımda kaldı. Yani kolu 4 birim genişlige ayarlarsam kol şeritde her temas ettiğinde 4 biti alıp getirebilen bir yapı diye düşünüyordum. Yanlış düşünüyor olabilirim bu konuda yeni olduğumu söylemiştim :)

Senin anlattığından ise kolun sabit bir genişlikte olduğunu örneğin 8 birim ve her defasında bu kadar bilgiyi aldığımızı ve daha azına ihtiyaç duyduğumuz zamanlarda ise fazlasını atmamız gerektiğini anlıyorum.

Peki benim dediğim şekilde yapılma imkanı yok mu? Sanki bu daha doğal geliyor. Bu arada sanırım MSB kısaltması 'Most Significant Bit' demek oluyor bunun yerine EYB desek daha güzel olmaz mı?

2 -> 2. Tamam şimdi anladım ikiye bölme olayını, ama neyi saydığımızı anlamadım :-/ Ali'nin bit işlemleri bölümünü okuyorum zaten dikkat ettiysen "Maskeleme" ile ilgili yazı o bölümden alınma.

1 -> 3. Bence buradaki sorun esneklik veya en büyük değer sorunu değil. Bu bence biraz daha farklı bir durum.Yani bana şu sebzelerden gönderirsen sana salata yaparım deyip, sonra çorba yapmaya benziyor :-D Biraz tuhaf bir benzetme oldu farkındayım :)

Yani neticede böyle gerekiyorsa böyle kalsın, ben detayı hala tam anlamadım sadece böyle bir şey olduğunu söylemek istedim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 19, 2012

Alıntı (zafer):

>

Biz eğer 0b_1001 (9) gibi 4 bit bir veri arıyorsak neden kafa mekanizması veri şeridinden her defasında 4 bit okumuyor. Bunu engelleyen nedir?
Çünkü biz bit'leri arıyoruz nibble (4 bit) genişliğindeki değerleri değil. Bu konuda Turing Machine (https://www.google.com.tr/search?q=Turing+Machine) konusunu araştırmanı öneririm. Sanırım hemen sadeliğin güzelliğini keşfedeceksin...

Alıntı (zafer):

>

Senin önceki mesajlarından da aklımda kalanları toplarlamak gerekirse ben veriyi 1 ve 0'lardan oluşan uzun bir şerit gibi düşünmüştüm kafa ise bizim istediğimiz ölçülerde genişleyen veya daralan bir kol diye aklımda kaldı. Yani kolu 4 birim genişlige ayarlarsam kol şeritde her temas ettiğinde 4 biti alıp getirebilen bir yapı diye düşünüyordum. Yanlış düşünüyor olabilirim bu konuda yeni olduğumu söylemiştim :)
Bence doğru düşünüyorsun...:)

Alıntı (zafer):

>

Senin anlattığından ise kolun sabit bir genişlikte olduğunu örneğin 8 birim ve her defasında bu kadar bilgiyi aldığımızı ve daha azına ihtiyaç duyduğumuz zamanlarda ise fazlasını atmamız gerektiğini anlıyorum.
Şimdi doğal olarak işleyebileceğimiz en küçük veri byte olduğu için mecburen fazlasını atmamız gerekiyor. Yoksa önceki iletimde bahsettiğim gibi aradığımız değeri bulamayabiliriz.

Alıntı (zafer):

>

Peki benim dediğim şekilde yapılma imkanı yok mu? Sanki bu daha doğal geliyor.
Senin dediğin şekilde çalışan bir kod örneği gösterebilir misin?

Alıntı (zafer):

>

Bu arada sanırım MSB kısaltması 'Most Significant Bit' demek oluyor bunun yerine EYB desek daha güzel olmaz mı?
Eğer EYB diye kısaltma kullansaydım muhtemelen bunun ne anlama geldiğini bulman çok vakit alacaktı...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]