2009-12-29 5 views
5

Kaydırılan sayı pozitif ise >>> ve >> aynı şekilde çalışır.>>> ve >> operatörler arasındaki fark

kaydırılmış sayı >>> negatiftir 0.

benim anlayış doğru mu ile MSB'lerini dolum >> operasyon vardiya oysa 1'ler ile en anlamlı bitleri dolarsa?

Negatif sayılar MSB setinde 1 olarak ayarlanmışsa ve Java'nın kullandığı 2s tamamlayıcı yolla değil, operatörler tamamen farklı davranırlardı, doğru mu? olanlarla doldurur >> ederken ho bit 1.

+0

Olası kopyalar: [>>> ve >>] arasındaki fark (http://stackoverflow.com/q/2811319/1529630), [Java'nın >> versus >>> Operatör?] (http://stackoverflow.com/q/1034640/1529630) – Oriol

cevap

8

Negatif sayıların temsil edilme yolu 2'nin tamamlayıcısı olarak adlandırılır. Bunun nasıl çalıştığını göstermek için, -12'yi örnek olarak alın. 12, ikili olarak 00001100'dür (tamsayılar gerçekte 8 bit olsa da, daha büyüktürler). 2'nin tamamlayıcısını, her bit'i tersine çevirerek alın ve 11110011'i elde edin. Sonra, 11110100'ü almak için sadece 1'i ekleyin. Aynı adımları tekrar uygularsanız, pozitif 12'ye geri dönersiniz.

>>> ne olursa olsun sıfırdan geçiş yapar, yani 12 >>> 1 size 6 00000110, 6 ve (-12) >>> 1 size 01111010, 122 vermelidir. Aslında bunu Java'da deneyin, çünkü Java girişleri aslında 8 bitten daha büyüktür.

>> bit, en yüksek bitle aynıdır, böylece pozitif sayılar pozitif kalır ve negatif sayılar negatif kalır. 12 >> 1 00000110 (hala 6) ve (-12) >> 1 negatif 611111010 olur.

1

Tam tersi, >>> sıfırlarla doldurur:

n>>>s değeri n sağ kaymıştır s sıfır uzatma ile bit pozisyonları. N pozitif ise, sonuç n>>s ile aynıdır; n negatifse, soldaki işlenenin türü ise (n>>s)+(2<<~s) ifadesinin sonucuna eşittir ve soldaki işlenenin türü long ise, (n>>s)+(2L<<~s ifadesinin sonucudur.

+0

Neden "7 >>> 32 = 7" yi açıklayabilir misiniz? Dairesel değişimleri duydum, ama sadece '>>' için geçerli olduğunu düşündüm. 32 vardiyadan sonra 7 >>> 32'si sıfıra eşit olmaz mıydı? –

+0

@IanLimarta: Sol taraf bir int ise, vardiya miktarı mod 32 azalır. Sizin durumunuzda, vardiya miktarı 0'dır, bu da etkin olmayan bir işlemdir. Bkz. [JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19) –