| |
|
Salih Dinçer 
| Alıntı (acehreli):
> Ama bu kuralı bütün sütunlara uygulayamıyorum.
Haklısınız, çünkü iki istisna durumu o zaman keşfetmemiştim. Bunu kodlardan görebilirsiniz:
import std.stdio;
struct Mask {
uint ara; // iki desene ara'sı
char bit; // desenleri bit'ler ile ifade edilmesi (byte karşılığı)
};
void main() {
auto maske = [ Mask(0, 32), Mask(0, 64), Mask(0,128), Mask(1, 1),
Mask(0, 2), Mask(0, 4), Mask(0, 8), Mask(0, 16) ];
for(int i; i < 10; i++) {
foreach(ref s; maske) {
writef ("%d + %d\t", s.bit, s.ara);
}
writefln(" = %d", maskÖtele(maske));
}
}
uint maskÖtele (ref Mask[] desen)
{
if(desen[0].bit > 16) {
if(desen[0].bit != 64) desen[0].ara++;// İstisna hariç MSB ise arttır!
final switch (desen[0].bit) {
case 128: desen[0].bit = 4; break;
case 64: desen[0].bit = 2; break;
case 32: desen[0].bit = 1; break;
}
} else desen[0].bit <<= 3;
//----------------------------------------------------1.desen biter!
if(desen[1].bit == 128) desen[1].ara++;// Tanımsız istisna için FIX 1a
if(desen[1].bit < 8) {
if(desen[1].bit != 2) desen[2].ara++; // Sonraki bit, (2)'yi arttır!
final switch (desen[1].bit) {
case 1: desen[1].bit = 32; break;
case 2: desen[1].bit = 64; break;
case 4: desen[1].bit = 128; break;
}
} else desen[1].bit >>= 3;
if(desen[1].bit == 1) desen[1].ara++; // Tanımsız istisna için FIX 1b
//----------------------------------------------------2.desen biter!
if(desen[2].bit == 1) {
desen[3].ara++; // Sonraki bit, (3)'ü arttır!
desen[2].bit = 128;
} else desen[2].bit >>= 1;
//----------------------------------------------------3.desen biter!
if(desen[3].bit == 128) {
desen[3].ara++; // İçe dönükse kendini arttır...
desen[3].bit = 1;
} else desen[3].bit <<=1;
//----------------------------------------------------4.desen biter!
if(desen[4].bit > 16) {
if(desen[4].bit != 64) desen[4].ara++; // İstisna hariç MSB ise arttır!
final switch (desen[4].bit) {
case 128: desen[4].bit = 4; break;
case 64: desen[4].bit = 2; break;
case 32: desen[4].bit = 1; break;
}
} else desen[4].bit <<= 3;
//----------------------------------------------------5.desen biter!
if(desen[5].bit == 128) desen[5].ara++; // Tanımsız istisna için FIX 2a
if(desen[5].bit < 8) {
if(desen[5].bit != 2 ) desen[6].ara++; // Sonraki bit, (6)'yı arttır!
final switch (desen[5].bit) {
case 1: desen[5].bit = 32; break;
case 2: desen[5].bit = 64; break;
case 4: desen[5].bit = 128; break;
}
} else desen[5].bit >>= 3;
if(desen[5].bit == 1) desen[5].ara++; // Tanımsız istisna için FIX 2b
//----------------------------------------------------6.desen biter!
if(desen[6].bit == 1) {
desen[7].ara++; // Sonraki bit, (7)'yi arttır!
desen[6].bit = 128;
} else desen[6].bit >>=1;
//----------------------------------------------------7.desen biter!
if(desen[7].bit == 128) {
desen[7].ara++; // İçe dönükse kendini arttır...
desen[7].bit = 1;
} else desen[7].bit <<=1;
//----------------------------------------------------8.desen biter!
uint yMask = 0;
for(short i; i < 8; i++) yMask += desen[i].ara;
return 8 + yMask; // Veri demetinin toplam genişiliğini döndür...
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
|