SORU
26 EYLÜL 2008, Cuma


Bit shift (bit-shift) operatörleri nedir ve nasıl çalışır?

Boş zaman ve diğer diller benim C (C#, Java, vb.) öğrenmeye çalışıyorum aynı kavram (ve genellikle aynı operatörler)

Bit kaydırma yapar, temel bir seviyede, benim asıl merak ettiğim (&;< lt;, ^< . , ^<< . ) sorunları etrafında dolanan sorunlar ne çözmek ve yardım bend ne olabilir? Diğer bir deyişle, mutlak bir acemi rehber bit hepsi onun iyiliği kayıyor.

CEVAP
26 EYLÜL 2008, Cuma


Bit kaydırma operatörleri kendi adından da anlaşılacağı tam olarak ne. Bitlerin hepsi. İşte farklı vardiya operatörleri için (ya da değil-çok-kısa) kısa bir giriş.

Operatörler

  • >> (imzalı) aritmetik sağa kaydırma operatörü.
  • >>> (veya imzasız) mantıksal sağa kaydırma operatörü.
  • << sola kaydırma operatörü, mantıksal ve aritmetik vardiya ihtiyaçlarını karşılar.

Bu operatörler tüm tamsayı değerler (int, long, short byte char muhtemelen) uygulanabilir. Bazı dillerde, herhangi bir veri türü int daha küçük vardiya operatörleri uygulama otomatik olarak int bir ifadenin yeniden boyutlandırır.

<<< gereksiz olurdu çünkü bir operatör değil, unutmayın. Ayrıca C ve C sağ shift operatörleri arasında distingiush unutmayın. Sadece >> operatör güvenliği ve vites davranış, uygulama tanımlı.


Shift (&;< lt;) sol

Tam sayılar, bit dizisi olarak bellekte saklanır. Örneğin, 32-bit int Sayı 6 saklanır:

00000000 00000000 00000000 00000110

Bu bit desen bir pozisyon (6 << 1), vites sayısı 12 neden:

00000000 00000000 00000000 00001100

Gördüğünüz gibi, bu rakam bir pozisyon sola kaymış ve sağdaki en son rakam sıfır ile doldurulur. Ayrıca sol vites 2'nin katları ile çarpma eşdeğer olduğunu unutmayın. Yani 6 << 1 6 * 2 eşdeğer 6 << 3 6 * 8 eşdeğerdir. İyi bir optimize derleyici mümkün olduğunca vardiya ile çarpımları yerini alacak.

Non-dairesel kayması

Lütfen bu olduğunu unutmayındeğildairesel kayar. Bir pozisyon sola bu değer (3,758,096,384 << 1) kayması:

11100000 00000000 00000000 00000000

3,221,225,472 sonuçları:

11000000 00000000 00000000 00000000

Alır basamağı "sonunda" kaybolur. kaymıştır Etrafında kaydırma değil.


Mantıksal sağa kaydır (^<< . )

Mantıksal sağa bir sola kayma shift için converse. Soldaki bit taşımak yerine, onlar sadece sağa doğru hareket ettirin. 12 numara değişen örneğin,:

00000000 00000000 00000000 00001100

bir düzey hakkı (12 >>> 1) geri dönüş yapacağız bizim orijinal 6:

00000000 00000000 00000000 00000110

Sağa kayması 2 güçler tarafından bölünme eşdeğer olduğunu görüyoruz.

Kayıp bit gitti

Ancak, vardiya geri kazanmak "" bit. kayıp olamaz Eğer biz shift örneğin, bu model:

00111000 00000000 00000000 00000110

left 4 pozisyon (939,524,102 << 4), 2,147,483,744 elde ederiz

10000000 00000000 00000000 01100000

ve sonra geri vites ((939,524,102 << 4) >>> 4) 134,217,734 elde ederiz

00001000 00000000 00000000 00000110

Bit kaybettik sonra orijinal değeri geri veremeyiz.


Aritmetik sağa kaydırma (^< . )

Aritmetik sağ shift sıfır ile doldurma yerine, en önemli bit ile ped dışında tam olarak mantıksal doğru kayması gibi. Bu en anlamlı bit olmasıdırişaretbit, ya da pozitif ve negatif sayıları ayırt eder biraz. En anlamlı bit doldurma tarafından, aritmetik sağ shift işareti-koruma.

Biz negatif bir sayı olarak bu bit desen yorumlamak, örneğin:

10000000 00000000 00000000 01100000

numarasını -2,147,483,552 var. Değişen aritmetik shift (-2,147,483,552 >ile 4 pozisyonlar için bu >4) bize verilen:

11111000 00000000 00000000 00000110

ya da numarasını -134,217,722.

Aritmetik sağa kaydırma, mantıksal doğru kayması yerine kullanarak, negatif sayıların işareti korunmuş olduğunu görüyoruz. Ve bir kez daha, 2'nin katları ile bölme ifa ettiğini görüyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Louis C.K.

    Louis C.K.

    18 HAZİRAN 2006
  • pilslajt

    pilslajt

    20 HAZİRAN 2008
  • Tom Megalis

    Tom Megalis

    18 NİSAN 2006