2011-01-27 22 views
10

Olası Yinelenen: ikili bir int dönüştürülen olarak
why is 1>>32 == 1?Neden (-1 >>> 32) = -1?

-1 32 1 en ile temsil edilir. 31 kere sağa kaydırdığımda 1 (31 0 ve 1) alırım. Ama 32 kez sağa kaydırdığımda, -1'i tekrar alırım. 0'a eşit değil mi? aşağıdaki gibi

+1

Java gibi görünüyor. '>>> operatörünü tanımlayan birçok dili bilmiyorum. – leppie

+0

Java'nın temellerini öğrenmeye çalışırken ben buna rastladım, evet, ama etiketlemedim, bu yüzden biraz değişimin oldukça genel bir kavram olduğunu varsaydım. – user183037

+1

kontrol: http://stackoverflow.com/questions/3170412/why-is-132-1 Link için –

cevap

17

Java belirlediği shift operators açıklıyor:

sol tarafındaki terimin terfi türü sadece sağ işlenen beş düşük seviyeli bitleri vardiya olarak kullanılan int ise mesafe. Sağ işlenen işlenenin, 0x1f maske değeri ile bir bitlik mantıksal AND işleci & (§15.22.1) tabi tutulması gibi. Gerçekte kullanılan kaydırma mesafesi her zaman dahil 0 ila 31 aralığındadır.

32 & 0x1f değeri sıfırdır. Sol işlenen long ise

, o zaman 63'e üst sınırı genişleyen yerine kaymasını herhangi bir spesifik beklenen değere sahip olmak amacıyla 31.


sağ işlenen için ekstra biraz olsun - Sağdaki 1, tam sayıların (örneğin, iki tamamlayıcı) yanı sıra bit sayısını (örneğin, 32) temel ikili temsilini belirtmeniz gerekir. Her programlama dili bunları farklı şekilde tanımlayabilir, ancak uygulama için işleri basitleştirmek adına, genellikle kullanılabilir bitlerin sayısından daha fazla değişime izin verilmediğini belirtirler. Bunun nedeni, temeldeki CPU donanımının da desteklememesidir. Sonuçta, bu çok bitleri değiştirmek istiyorsanız, sonuç her zaman aynı olacağından, sol işlenen artık önemli değildir.

+0

Teşekkür ederim, bu mantıklı. – user183037

+1

BTW, x'in int veya long olup olmadığını x '63' veya 'x >> -1' kullanarak' x' nin üst bitini alabileceğiniz anlamına gelir. ;) –

+0

Vites değişimi ayrıca 32/64 bit sistemine de bağlı olabilir. – TheCottonSilk

İlgili konular