Przesunięcie w prawo bez znaku

0

Hej!

Mam jedno małe pytanko.

Mam zmienną typu

byte b = -8;

i binarnie jest to '1111 1000'. Wykonuję na niej przesunięcie w prawo bez znaku ">>>" i oczywiście operator ten najpierw rozszerzy mi zmienną 'b' do typu 'int' rozszerzając oczywiście znak. Tylko teraz pytanie: czy rozszerzy mi zmienną do postaci '1111 1111 1111 1111 1111 1111 1111 1000' czy do '1000 0000 0000 0000 0000 0000 1111 1000'?

Przypuszczam, że opcja nr 1, ale upewnijcie mnie proszę :)

Będę wdzięczny za odpowiedź :)

Pozdrawiam!

0

Wklejony art nie odpowiada na moje pytanie.

1

Nie rozumiem czemu tego nie sprawdziles...
http://ideone.com/5ml4kN

Dodam, ze ten artykul oczywiscie odpowiada na Twoje pytanie. Chyba, ze pytanie jest inne niz je tutaj zadales.

1
Gjorni napisał(a)

Wklejony art nie odpowiada na moje pytanie.

A czego Ty oczekujesz? Że w każdym artykule będzie Twoje pytanie cytowane i udzielona na nie dokładna odpowiedź? Twoje pytanie dotyczy przesunięcia bitowego, więc w każdym artykule będzie ono opisane;

W podanym przeze mnie artykule masz dokładnie opisane przesunięcia bitowe w lewo i prawo, ze znakiem i bez, nawet przykłady są - wystarczy je na spokojnie przeanalizować;


Operator prawego przesunięcia bez znaku >>>

Działanie n >>> s to przesunięcie s bitów w n wliczając bit znaku (bit znaku traci swoją wyjątkowość i jest traktowany jak każdy inny bit).

Z przesunięciem bez znaku "wypełniaczem" staje się 0, co może zamazać bit znaku i zmienić znak wyniku, który zawsze będzie dodatni.

Próbując wyrazić działanie >>> wzorem stosuje się następującą zasadę - jeśli lewy operand jest dodatni, wtedy wynik jest identyczny z prawym przesunięciem ze znakiem. Jeśli jednak lewy operand jest ujemy, wtedy wynik równa się (n >> s) + (2 << ~s). I właśnie ten wzór mnie zmroził najbardziej. Aż mnie do tej pory ciarki przechodzą :)

Przykład: 11 >>> 3 = 11 >> 3 = 11 / 2^3 = 1

11 (binarnie)       0000 0000 0000 0000 0000 0000 0000 1011
przesunięcie o 3    0000 0000 0000 0000 0000 0000 0000 0001

wynik:              1 (dziesiętnie)


Przykład: -17 >>> 3 = 536870909

-17 (binarnie)      1111 1111 1111 1111 1111 1111 1110 1111
przesunięcie o 3    0001 1111 1111 1111 1111 1111 1111 1101

wynik:              536870909 (dziesiętnie)

Źródło: http://jlaskowski.blogspot.com/2012/01/o-operatorach-przesuniec-w-javieprawie.html

0

Java to nie C++, w Javie jest zdecydowanie mniej "undefined hehaviour" czy "implementation specific". "implementation specific" są np działania na floatach bez słowa kluczowego "strictfp", ale już działania na intach są na sztywno okreśłone. Dlatego najłatwiejszym sposobem na sprawdzenie zachowania Javy jest po prostu odpalenie kodu.

Zresztą bardzo możliwe, że nawet w C++ postawione pytanie nie dotyka żadnego "undefined behaviour" czy "implementation specific".

0

@Furious Programming, zwracam honor. Faktycznie odpowiedź jest w arcie i bije w oczy. Dziękuję za wstawkę. @n0name_l, dzięki również.

1 użytkowników online, w tym zalogowanych: 0, gości: 1