Thread overview
Phobos'daki Bit Manipülasyon Olanakları
Feb 13, 2022
Salih Dincer
Feb 13, 2022
Ali Çehreli
Feb 15, 2022
Salih Dincer
Feb 15, 2022
Ali Çehreli
Feb 15, 2022
Salih Dincer
February 13, 2022

Merhaba Ali Hocam,

Yabancı forumun tekrarı olabilir, o yüzden kusura bakmayın lütfen...

D'de bit'ler üzerinde işlem yapma kabiliyeti sadece işleçler ( &, |, ~, >>, <<)'den mi ibaret? Şöyle kısa bir giriş yapsak neler diyebiliriz?

Örneğin şu olanaklar hali hazırda var mı?

https://github.com/stevenhalim/cpbook-code/blob/master/ch2/lineards/bit_manipulation.cpp

Teşekkürler...

February 13, 2022
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

February 15, 2022

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...

February 15, 2022
On 2/15/22 01:25, Salih Dincer wrote:

> *Scans the bits in v starting with bit 0, looking for the first set bit.*

Sıfırıncı bitten başlar dediğine göre üst bite doğru ilerleyecek: 0, 1, 2, ...

> *Scans the bits in v from the most significant bit to the least
> significant bit

O da diğer taraftan sayıyor.

Benim deneyime göre bir terslik yok:

import core.bitop;

void main() {
  //               bit 1
  //                   |
  assert(bsf(0x0001_0002) == 1);
  assert(bsr(0x4001_0000) == 30);
  //           |
  //      bit 30
}

Ali

February 15, 2022

On Tuesday, 15 February 2022 at 09:56:28 UTC, Ali Çehreli wrote:

>

On 2/15/22 01:25, Salih Dincer wrote:

>

Scans the bits in v starting with bit 0, looking for the
first set bit.

Sıfırıncı bitten başlar dediğine göre üst bite doğru ilerleyecek: 0, 1, 2, ...

>

*Scans the bits in v from the most significant bit to the
least
significant bit

O da diğer taraftan sayıyor.

Benim deneyime göre bir terslik yok:

import core.bitop;

void main() {
// bit 1
// |
assert(bsf(0x0001_0002) == 1);
assert(bsr(0x4001_0000) == 30);
// |
// bit 30
}

Ali

Evet hocam, öğle yemeğini yedim ve geldiğimde tekrar baktım 😀

İşlevlerime verdiğim anlam doğru:

  • ilkBit_DeğSağ():İlk bitin değeri, sağdan
  • ilkBit_DeğSol():İlk bitin değeri, soldan

Eee zaten bsf() taramaya sıfırdan (yani sağdan) başlar diyor. Aynı şekilde bsr() de MSB'den (yani soldan) başladığına göre açlık veya gençlik başıma vurmuş olmalı. O zaman hepberaber Ateş Böceği şarkısını söylüyoruz: 😀

https://tr.pinterest.com/pin/389279961544938437/

Gençlik başımda duman
(Açlık başıma vuran)
İlk aşkım, ilk heyecan!
(D aşkım, D heyecanım)

😀 😃 🙂

Hala yaşayan, Güzin Sokullu ve Baha Boduroğlu uzun ömürler olsun.

Sevgiler, saygılar...