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
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.
Nasıl shift operatörleri Java mı?...
Çarpma ve bölme C shift operatörleri k...
Ember RunLoop nedir ve nasıl çalışır?...
Android nedir:android weightSum ve nas...
Bir csrf token nedir ? o'nin önem...