Jak w temacie.
XOR z liczbą która ma ustawiony tylko bit znaku. Czyli np mając zmienną typu int8_t
o nazwie b
, negujesz jej bit znaku za pomocą b ^= 0x80
. Uwaga: nie jest to równoznaczne z negacją liczby w kodzie U2.
Tak się składa, że w kodzie U2 liczba która ma zapalony tylko bit znaku jest jednocześnie najmniejszą możliwą liczbą, więc negacja np int32_t
może wyglądać tak: zmienna ^= INT32_MIN
.
Wibowit sorry ale nie rozumiem. Zademonstruj mi to na przykładzie. Napisz mi program w c++, który zaneguje bit znaku w liczbie powiedzmy 34.
Poczytaj o systemie kodowania liczb ze znakiem U2 lub pod inną nazwą Two's Complement i wszystko będzie jasne. Chcąc zmienić znak na przeciwny np z 34 na - 34 robisz to następująco.
- dokonujesz inwersji wszystkich bitów
- dodajesz jeden
Oczywiście kompilator zrobi to za ciebie gdy napiszesz int x=34; x=-x;.
Liczba 34 nie ma bitu znaku. Bit znaku ma zmienna w reprezentacji która ma bit znaku. Np bit znaku możesz zmienić w zmiennej typu int32_t
.
Sory Wibowit. Masz oczywiście rację. Tylko liczby ujemne mają bit znaku. Pokaż mi kod w c++ negacji bitu znaku np. w liczbie -34.
Nie zrozumiałeś. Liczby nie mają bitu znaku. Liczby nie mają żadnych bitów. Reprezentacje mają bity. A daną liczbę możesz zapisać w różnych reprezentacjach. Jeśli jest to int8_t
, int16_t
, int32_t
czy int64_t
to bitem znaku jest najwyższy bit. W zależności od typu oczywiście indeks tego typu może być inny.
Negowanie bitu znaku w int32_t
: http://ideone.com/zDriRO
@Mikilll: Wibowit już Ci napisał wyrażenie, tu masz trochę więcej:
Edit: pan ze wskazanej strony chyba niespecjalnie przejmuje się prawami autorskimi (książki w formie PDF), więc nie będzie miał nic przeciwko jeśli zrobię streszczenie:
- negacja bitu znaku
int a = 34;
a ^= INT_MIN;
- negacja znaku
int a = 34;
a = ~a + 1;