Operacja bitowa & w c++;

Operacja bitowa & w c++;
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:26
0

Witam.
Chciałbym, żebym ktoś wytłumaczył mi jak działą operacje bitowe & w c++.
Uproszczony kod wygląda tak:

Kopiuj

int value = -2147478010;
value =  value & 0x7FFFFFFF;
 

Zmienna value wychodzi: 5638 - co jest ok. Tyle, że nie rozumiem jak to się dzieje konkretnie bo jak wyliczę wszystko to wychodzi mi:
-2147478010 binarnie to 1111111111111111110100111
0x7FFFFFFF binarnie to 1111111111111111111111111
wynik: 1011000000110

Z godnie z tym...
0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1

...zastanawiam się jak to jest możliwe? Już pierwszy bit się nie zgadza, że o reszcie nie wspomnę:)

edytowany 2x, ostatnio: Miszcz_
ZJ
  • Rejestracja:około 14 lat
  • Ostatnio:około 12 lat
0

"-2147478010 binarnie to 1111111111111111110100111" nie prawda. Patrz http://pl.wikipedia.org/wiki/Kod_uzupe%C5%82nie%C5%84_do_dw%C3%B3ch .

Endrju
A jaką masz pewność, że akurat to kodowanie zostanie użyte? To chyba jest całkowicie zdefiniowane przez platformę, nie?
ZJ
Założyłem, że jest to jeden z tych 99 % przypadków. C ma bardzo elastyczny standard.
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:prawie 2 lata
0

Ponieważ standard nie definiuje w jaki sposób mają być przechowywane liczby ze znakiem lepiej w ogóle nie robić na nich operacji bitowych, bo wynik może być właśnie taki, jakiego się nie spodziewasz.

Aby mieć pełną i niezawodną kontrolę nad maską bitową używaj po prostu liczb bez znaku.

Oczywiście zgadzam się z postem wyżej - najczęściej używaną metodą zapisu jest kod uzupełnień do dwóch i to on jest "źródłem" Twojego problemu.


"(...) otherwise, the behavior is undefined".
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:26
0

Wielkie dzięki za naprowadzenie, mam jeszcze ostatnie pytanie, liczba -2147478010 ma 32 bicie ustawioną 1, co się z nią dzieje po w/w operacji w końcowym wyniku? (teoretycznie też powinna być ustawiona na końcu).

edytowany 1x, ostatnio: Miszcz_
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 7 godzin
2
Endrju napisał(a)

A jaką masz pewność, że akurat to kodowanie zostanie użyte? To chyba jest całkowicie zdefiniowane przez platformę, nie?

Tak, ale innego kodowania niż U2 się po prostu nie używa. Podobnie jest z kodowaniem ASCII oraz liczbami zmiennoprzecinkowymi wg. IEEE.
Tym bardziej binarnością wszystkich współczesnych komputerów, i 8-bitowym bajtem.
Spokojnie więc te parametry można założyć, a jakąś totalną egzotyką powstałą tylko po to, by udowodnić że wcale nie musi tak być, można się nie przejmować.

edytowany 1x, ostatnio: Azarien

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.