2012-11-23 18 views
11

Kısa bir süre önce bir Java kursu (1 haftalık bir çöküş kursu) yaptım ve bazı ikili matematiği ele aldık.Unary "~" operatörü - Burada tam olarak ne oluyor?

Bu birli ~ operatörü (Ben deniyor sanırım tilde?) Böylece bize açıkladı:

İçine bir "1" ve her "1" içine her "0" dönüm bit deseni ters çevirir bir " 0" . , ör. Bayt için 8 bit vardır. Eğer şu byte varsa: 00000000 ters değeri yukarıdaki açıklama açık ve özlü 11111111.

haline dönüşür ve tamamen bana mantıklı olacaktır. O zamana kadar, onu uygulamaya çalışıyorum.

Verilen bu:

byte x = 3; 
byte y = 5; 
System.out.println(~x); 
System.out.println(~y); 

çıktısı:

-4 
-6 

Bunun nasıl gerçekleştiğini hakkında çok karıştı. ikilik sistemde 3 11 olduğunu

, o zaman bu inversiyon açıkça olmadığı -3, 00 olurdu.

Ama 8 bit bir bayt içinde olduğu gibi, daha sonra +3 ikili gösterimi 00000011 olarak yazılmamalıdır?

11111100 olması tersine çevrilebilir. Ondalık değere dönüştürülürse bu 252 olur. +3'ı 011 olarak yazarsanız, gerçekten 100'e dönüşür, bu da +4'dür. negatif bir sayı olduğunu biliyor musun?

Eğer bir işareti olarak ilk kullandıkları taktirde 1100, dönüştüğü, 0011 çalışırsanız hakkında, o zaman gerçekten hale gelmez Nasıl -4.

Ah - bu noktada bir yere gittiğimi sandım.

Ama sonra ikinci y değeri = biz bunu yazmak nasıl 5.

lazım? Aynı mantıkla, 5, ikili 0101 dönüşür 1010.

için tersine çevirir hangi Ve ben korkunç karıştı şimdi tarafta. Bu, işaretli bir -2 değeri mi, yoksa işaretsiz bir +10 ondalık değeri mi temsil ediyor? İkisi de basılmadığım -6.

Yine, bir baytın 8 basamağına kadar olan uzunluğu arttırırsam +5 00000101 olur, bu da tersine 11111010 olur. Ve bunu gerçekten -6'ya dönüştürmenin bir yolunu bulamıyorum.

Ben haline daha karıştı çıktısını burada neler olduğunu hiçbir fikri ve daha numarasına sahip olduğu gerçek olmayan biri, bu anlıyor mu. Bkz :-(.. belki biraz operatör işaretleri bakarak sevmez bu gösteri

+2

Java'daki tüm sayısal sayısal türler * ile imzalanmıştır *. –

+2

@MarkoTopolnik char sayısal bir türüdür ve imzalanmamıştır. –

+0

2'nin tamamlayıcısı olduğuna ilişkin tüm çok yararlı cevaplardan sonra, bu videoyu oldukça iyi açıklayan bir video buldum. Cevap için teşekkürler. http://www.youtube.com/watch?v=Hof95YlLQk0&NR=1&feature=endscreen –

cevap

4

Vikipedi'den: İkili tamamlama notasyonunda, negatif olmayan bir sayı, olağan ikili temsiliyle temsil edilir; Bu durumda, en anlamlı bit 0'dır. İkinin tamamlama işlemi, olumsuzlama işlemidir, bu nedenle negatif sayılar, mutlak değerin iki tamamlayıcısı tarafından temsil edilir.
İkilinin bir ikili sayı tamamlamasını elde etmek için, bitler DEĞİL NOT işlemi kullanılarak, tersine çevrilir veya "çevrilir"; Daha sonra, 1'in değeri, her ikisi de 0. http://en.wikipedia.org/wiki/Two%27s_complement

'u alırken oluşan taşmayı göz ardı ederek ortaya çıkan değere eklenir. Yani 0101'iniz varsa, bunun +5'i 1010'dur, yani -5 .

Gerçekten de 010'ı 5 olarak okumazsınız, ancak başlangıçta 1'i gördüğünüzde, rakamı almak için rakamın geri kalanını almanız gerektiğini bilirsiniz. reddetmek istiyorsun. Mantıklı geliyorsa.

Daha önce bununla çalışmadıysanız, biraz yabancı bir kavram var. Bu kesinlikle ondalık sayıların işleyiş şekli değil, ne olduğunu gördüğünüzde aslında basittir. 1010.

Bir şey:

8 ondalık değeri ilk basamak (1) negatif demektir ve sonra sayısal değeri almak için geri kalanını çevirmek 10101. için olumsuzlar olan 01010 olarak yazılır

Hatırlamak gerekirse, İki'in tamamlayıcısı, sıradan eski ikili sistem sayımıyla aynı değildir. Normal ikilide 10101 değeri (ki bu ikiliğin tamamlayıcısı -8 olduğu gibi) elbette 21'dir. Sanırım bu karışıklığın nereden geldiğini gösteriyor - aradaki farkı onlara bakarak nasıl anlıyorsunuz? Sayının değerinin gerçekte ne olduğuna karar vermek için hangi temsilin kullanıldığını bilmelisiniz. Aynı zamanda biraz farklı olan Bir'in tamamlayıcısı da var.

One's ve Two's complement de dahil olmak üzere ikili matematik hakkında iyi bir öğretici burada verilmiştir. http://www.math.grin.edu/~rebelsky/Courses/152/97F/Readings/student-binary

+0

Oh Görüyorum. Onları pozitif sayılarla aynı şekilde okumayı deniyordum, ama öndeki 1 ile. Bunun için teşekkürler. Ayrıca bağlantılar için - onlar parlak. Bunu şimdi anladım. Bence. :-) –

+0

Bunu eklemek istiyorum, bu 32 bit değerlerde olur. Yani, 3 dediğinizde, aslında 000000000000000000000000000000011 ikili oldu. Eğer ters çevirdiğinizde, iki tamamlayıcı 32 bit kelime -4 eşdeğer 1111111111111111111111111111111100 olur. –

7

: - -

Google bu çok şey ile gelip görünmüyor

3 -> 0011 
~3 -> 1100 -> -4 (2's complement) 

5 -> 0101 
~5 -> 1010 -> -6 (2's complement) 

imzalı tamsayı alarak 2'nin tamamlayıcı olarak depolanır yana 1100 ait 2's complement size 4 verir. Şimdi 1100 negatif bir sayıdır çünkü.Yani sonuç -4. 1010 ile aynı durumdur.

1100 
0011 - 1's complement 
0100 - 2's complement - value = 4 (take negative) 
+1

Ayrıca, bitwise tamamlayıcı operatörünün tek bir sayısal tanıtım gerçekleştirdiğini unutmayın. –

+0

2'nin tamamlayıcısı. Hmm. Eğitmenimiz bundan bahsetmedi. Google'a gidiyorum. Teşekkürler. :-) –

2

Signed tamsayılar neredeyse evrensel twos complement kullanılarak depolanır. Bu, bitleri tersine çevirmek (kişinin tamamlayıcısını almak) ve bir tane eklemek anlamına gelir. Bu sayede tamsayı sıfır (+0 ve -0) olmak üzere iki gösteriminiz yoktur ve belirli imzalanmış işlemlerin donanımda uygulanması daha kolay hale gelir.

2

Java, Two's complement numaralı belgede imzalı numaralar kullanır. Nedeni, "imzasız int" veya "imzasız char" olarak kullanıldığında C veya diğer dillerde doğru olacaktır.