Operacja bitowa & w c++;

0

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


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ę:)

0

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

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.

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).

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ć.

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