On Sunday, 13 February 2022 at 16:26:30 UTC, Ali Çehreli wrote:
> On 2/13/22 04:39, Salih Dincer wrote:
> D'de bit'ler üzerinde işlem yapma kabiliyeti sadece işleçler
( &, |, ~,
> > , <<)'den mi ibaret?
^ işleci C'de bile olduğuna göre, D'de de vardır herhalde. ;)
Bir de C ve C++'ta bulunmayan >>> işleci var. (Java'da da olduğuna göre belki D oradan almıştır.)
> Şöyle kısa bir giriş yapsak neler diyebiliriz?
Ben, "aşağıdaki fazla mı uzun olmuş" diyebilirim. :o)
http://ddili.org/ders/d/bit_islemleri.html
D'de mikroişlemcinin sağladığı olanakları sunan şöyle bir modül de var:
https://dlang.org/phobos/core_bitop.html
Ali
Merhaba hocam,
Henüz ilk 2 komut (bsf, bsr) da takıldım. Sanırım tam anlayamadım herhalde! İlki için şöyle bir açıklama var:
Scans the bits in v starting with bit 0, looking for the first set bit.
Returns:
The bit number of the first bit set. The return value is undefined if v is zero.
Examples:
assert(bsf(0x21) == 0);
assert(bsf(ulong.max << 39) == 39);
Yani özetle düşük değerli bit'den (LSB <- sağdan) başlar ve ilk 1 olan biti bulduğunda onun kaçıncı bit olduğunu söyler diyor. Ama ben sanki soldan başladığını tespit ettim, yanılıyor muyum? Peki diğerinin açıklamasına bakalım:
Scans the bits in v from the most significant bit to the least significant bit, looking for the first set bit.
Returns:
The bit number of the first bit set. The return value is undefined if v is zero.
Examples:
assert(bsr(0x21) == 5);
assert(bsr((ulong.max >> 15) - 1) == 48);
Burda ise, en anlamlı bit'den (MSB -> soldan) başa (LSB <- sağa) doğru tarar diyor, özetle. Eee sayısal elektronik açısından yine ters! Acaba İngilizce manayı ben ters anlıyor olabilir miyim? Yoksa bu 2. komutta first'den kasıt last mı; iyice kafam karıştı!
Özetle anlayabilmek için şu örneği (sadece sağa 8, sola 26 kaydırarak) basitçe geliştirdim. Assert için ise bit değerlerini geri döndüren 2 basit işlev yazdım.
import core.bitop, std.stdio;
void main()
{
auto b1 = uint.max >> 8;
uint r1 = 8388608;//+1; assert'in hata vermesi için
b1.bitYaz;
ilkBit_DeğSol!uint(b1).writefln!"soldan--^ (%d)";
r1.bitYaz;
assert(ilkBit_DeğSol!uint(r1) == r1);
writeln;
auto b2 = uint.max << 26;
uint r2 = 67108864;//+1; assert'in hata vermesi için
b2.bitYaz;
ilkBit_DeğSağ!uint(b2).writefln!" ^--sağdan (%d)";
r2.bitYaz;
assert(ilkBit_DeğSağ!uint(r2) == r2);
}
// https://dlang.org/phobos/core_bitop.html#.bsr
// Soldan ilk bit'in değerini verir:
T ilkBit_DeğSol(T)(T bit) {
auto hangiBit = cast(T)bsr(bit);
return 2^^hangiBit;
}
// https://dlang.org/phobos/core_bitop.html#.bsf
// Sağdan ilk bit'in değerini verir:
T ilkBit_DeğSağ(T)(T bit) {
auto hangiBit = cast(T)bsf(bit);
return 2^^hangiBit;
}
void bitYaz(uint sayı) { sayı.writefln!"%032b"; }
Yukardaki kodun çıktısı şöyle:
00000000111111111111111111111111
soldan--^ (8388608)
00000000100000000000000000000000
11111100000000000000000000000000
^--sağdan (67108864)
00000100000000000000000000000000
Başarılar...