Merhaba,
Bir süredir program yazmıyorum ve az önce, ara verdiğim sırada gerçekleşen önceki tartışmalara bakıyordum. Ali hocanın program fikri (-bknz. Banka hesap numarası okuma (http://ddili.org/forum/thread/1025)) aklıma, en az üç konumlu (True/False haricinde bir de Conflict) mantık değerinin çok işe yarabileceğini getirdi...
- Biliyorsunuz, Quantum Computing biliminde, elektronların alabileceği diğer karışık durum (hem 1, hem 0) gibi olaylar var.
- Hatta üç boyutlu modellemede (3D Modelling) X, Y haricinde bir Z'ye ihtiyaç duyuyoruz.
- Olayı daha da ileri götürüp (hali hazırda bir olanak) DNA bazı çiftlerini (A-T ve C-G) temsil edilebilir!
Bunlar için şöyle bir dizi ikilisi oluşturacağım:
private T[] highBit; // lowBit ve highBit 1 ise Z; tersi N(ull)
private T[] lowBit; // lowBit 1, highBit 0 ise Y; tersi X
Sonra bunları aşağıdaki veri türü ile döndürmeyi düşünüyorum...
enum triBit { N, X, Y, Z }
Ama veriler, daha önce forumda dolaylı olarak paylaştığım "Universal Stack" ile yapılacak. Böylece bellekte az yer kaplayacağı için çok verimli olacak. Ancak yukarıdan anlaşılacağı üzere (ve an itibariyle) kolaya kaçmış durumdayım. Çünkü highBit ve lowBit isminde iki diziden faydalanıp 00, 01, 10 ve 11 durumlarını iki değişken üzerinde tutmaya karar verdim...
Peki; sizce bunu yapmak yerine, CPU'dan biraz daha feragat edip (böylece %50 bellek tasarrufu mümkün) tek dizi üzerinden (küçük bir trick ile mümkün görünüyor!) yapmak daha mantıklı olabilir mi? Yani demek istediğim 1 byte'lık veri içersinde 4 tane tüm olasılıkları (00, 01, 10, 11) yerleştirebiliriz. Bunun için yapılacak trick ise sanki şu satır ile başlamak:
Alıntı:
> public:
> immutable type_length = (T.sizeof * 4); //<-- 8 idi sadece 4 yaptım ve belki olacak...:)
> ```
>
Bu arada universalStack kodlarını vereyim. Bu yığıt, benim gerçekten çok işime yarıyor. Çünkü bellekte true/false olarak duran veriler çok yer kaplıyorlar. Oysa biraz işlemle daha az yer kaplamaları mümkün.
class universalStack(T) {
private int konum;
private T[] stack;
public:
immutable type_length = (T.sizeof * 8);
this (size_t size) {
size_t taşmaVar_mı = size % type_length ? 1 : 0;
stack = new T[(size / type_length) + taşmaVar_mı];
}
void push(bool veri) @property {
immutable index = konum / type_length;
immutable xMask = konum % type_length;
if(veri) stack[index] |= cast(T)1 << xMask;
konum++;
}
private bool bitTest(size_t bit) {
T xCell = stack[bit / type_length];
T xMask = cast(T)1 << bit % type_length;/*
^----bu çok önemli çünkü
ulong'da sıkıntı yapıyor! */
return (xCell & xMask) != 0;
}
override string toString() {
string sonuç = "[";
foreach(i; 0..(type_length * stack.length)) {
sonuç ~= bitTest(i) ? "1" : "0";
}
return sonuç ~ "]";
}
}
import std.stdio;
void main() {
auto data = [ true, true, false, false, true, true ];
auto test = new universalStack!ubyte(1);
foreach(d; data) test.push(d);
test.writeln;
}
****İlgili kaynaklara da bakınız:****
- http://en.wikipedia.org/wiki/Four_value_logic
- http://en.wikipedia.org/wiki/Quaternary_numeral_system
- http://en.wikipedia.org/wiki/Qubit
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]