2013-03-24 9 views
10

Natknąłem się na interesujący scenariusz, podczas pracy z operatorem przesunięcia bitowego. Jeśli drugi operand jest ujemny, jak działa operacja przesunięcia bitowego? .Operator przesunięcia bitowego z przesunięciem o numer ujemny

tj a < < b "< <" przesunięcia wzorca bitów w lewo przez B bitów w. Ale jeśli b jest neagtive, nie powinien być błąd w czasie wykonywania?

Z powodzeniem mogę uruchomić poniższy kod, ale nie rozumiem, jak to działa?

public static void bitwiseleftShift(char testChar) 
{ 
    int val=testChar-'a'; 
    int result= 1<<val; 
    System.out.println("bit wise shift of 1 with val="+val+" is "+result); 
} 

Wejście

bitwiseleftShift('A');// ASCII 65 
    bitwiseleftShift('0'); // ASCII 48 

Wyniki

bit wise shift of 1 with val=-32 is 1 
    bit wise shift of 1 with val=-49 is 32768 

ASCII dla 'a' jest 97. Czy ktoś może mi pomóc zrozumieć, jak to działa?

Odpowiedz

9

Ale jeśli b jest neagtive, nie powinien być błąd w czasie wykonywania?

Nie według języka Java Specification, section 15.19:

Jeśli promowane typ operandu lewostronnego jest int, używane są tylko pięć bitów najniższego rzędu od argumentu prawostronnego jako odległość zmiany. To tak, jakby prawy operand był poddany bitowemu logicznemu operatorowi AND & (§15.22.1) z wartością maski 0x1f (0b11111). Właściwa długość przesunięcia jest zatem zawsze w zakresie od 0 do 31 włącznie.

Tak więc przesunięcie -32 faktycznie kończy się jako przesunięcie o 0, a przesunięcie -49 faktycznie kończy się jako przesunięcie 15 - stąd wyniki, które zobaczyłeś.

+0

Dzięki John! To odpowiada ... TAK mówi, że nie mogę zaakceptować odpowiedzi, dopóki nie minie jeszcze 6 minut ... :(Przy okazji, wielka fana! Cieszę się, że odpowiedziałeś! – prashantsunkari

Powiązane problemy