2016-06-29 54 views
5
yılında ikili negatif tamsayılar dönüştürmek için

Soru 1: Ben şu şekilde ikili negatif tamsayılar dönüştürmek için bir yol bulamıyorum. Bunu böyle dönüştürmem gerekiyor. nasıl Ruby

-3 => "11111111111111111111111111111101" 

aşağıda çalıştı:

sprintf('%b', -3) => "..101" # .. appears and does not show 111111 bit. 

-3.to_s(2) => "-11" # This just adds - to the binary of the positive integer 3. 

Soru 2: Ben çevrimiçi dönüştürücü kullanıyorsanız İlginçtir, benim -3 o ikili "00101101 00110011" olduğunu söyler.

"11111111111111111111111111111101" ve "00101101 00110011" arasındaki fark nedir?

+0

Sadece o – Li357

+2

gönderim başına bir soru sormak Lütfen tersi almak için pozitif bir sayının bitleri tersine çevirebilirsiniz. – mudasobwa

+2

Ayrıca, lütfen dönüştürme kurallarını açıklığa kavuşturun; Şu anda '-3' için 11111111111101' vermeyi düşünemiyorum. – mudasobwa

cevap

8

sonra -34294967293 dönüşecektir açma Paketleme (2 -3):

[-3].pack('L').unpack('L') 
=> [4294967293] 

sprintf('%b', [-3].pack('L').unpack('L')[0]) 
# => "11111111111111111111111111111101" 

sprintf('%b', [3].pack('L').unpack('L')[0]) 
# => "11" 
+0

Harika, işe yarıyor! ama bu durumda paketi ('L') ve açmayı ('L') [0] ne yapar? –

+0

@NobyFujioka, [Array # pack' belgelerini kontrol edin] (http://ruby-doc.org/core/Array.html#method-i-pack) veya ['String # unpack'] (http://ruby-doc.org/core/String.html#method-i-unpack). – falsetru

+0

Teşekkürler! :) –

1

Dene:

> 32.downto(0).map { |n| -3[n] }.join 
#=> "111111111111111111111111111111101 

Not: Bu uygulanır olumsuz nu Mber sadece.