2010-02-11 7 views
16

Ćwiczę na egzaminie SCJP przy użyciu napy z Internetu.Operatory przesunięć bitowych. Podpisany i niepodpisany

Zgodnie z moimi notatkami operator >> powinien zostać podpisany prawą zmianą, a bit znaku zostanie przeniesiony z lewej strony. Podczas gdy lewy operator zmiany << ma zachować bit znaku.

Zabawy jednak jestem w stanie przesunąć znak z operatorem << (fe Integer.MAX_VALUE << 1 ocenia się -2, a ja nigdy nie jestem w stanie przesunąć znak z operatorem >>.

I musi być nieporozumienie ? coś tutaj, ale co

+0

Zobacz, co daje ci '-2 << 31'. –

+0

Tak, rozumiem co masz na myśli! –

Odpowiedz

39

„>>” jest podpisany, ponieważ utrzymuje znak używa najbardziej lewą cyfrę binarnej reprezentacji liczby jako wypełniacz. na przykład:.

| this value is used as a filler 
    11011011 
>> 11101101 

    01010010 
>> 00101001 

">>>" jest niepodpisaną wersją tego operatora. Zawsze używa się jako wypełniacza zerowego:

11011011 
>>> 01101101 

    01010010 
>>> 00101001 

W reprezentacji binarnej najwięcej cyfr po lewej określa znak liczby. Tak więc, jeśli jest to "1", to mamy wartość ujemną i jeśli jest to "0" - wtedy nasza liczba jest dodatnia. Dlatego użycie najbardziej lewej cyfry jako wypełniacza pozwala zachować ciągłość znaku.

+0

Ah, ok, wtedy rozumiem, jak operatorzy prawej zmiany mają działać. Dzięki! Ale dlaczego mogę zmienić znak za pomocą "<<"? –

+0

Ponieważ przesuwa się w innym kierunku, a najbardziej po lewej stronie zależy od pierwotnego numeru. Używa 0 jako wypełniacza, ale dołącza go do prawej strony twojego numeru. – Roman

+0

Znak liczby całkowitej jest określony przez wartość jego lewego lewego bitu. Jeśli zmienisz "0", gdy jest "1" lub odwrotnie, znak wyniku zmieni się. –

2

Ideą przesunięć jest to, że mogą one działać jako pomnożenie i dzielenie przez 2 (< < 1 jest równoważne * = 2, >> 2 jest równoważne/= 4), dlatego podpisana wersja przesunięcia istnieje. Jednak niepodpisane przesunięcie nie zachowuje niekoniecznie negatywów. Operator < < w rzeczywistości nie zachowuje znaku, jak sugerujesz; po prostu dzieje się to w twoim przykładzie. Spróbuj wykonać lewą zmianę na 2 147 483 647; nie pozostaje dodatnia. Powodem, dla którego nie zadają sobie trudu zrobienia "podpisanej" lewej zmiany, jest to, że jeśli liczba przesunie się z dodatniej na ujemną (lub odwrotnie), to i tak przekroczysz granice typu zmiennej.