Jak zanegować bit znaku w C++?

0

Jak w temacie.

1

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.

0

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.

0

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.

  1. dokonujesz inwersji wszystkich bitów
  2. dodajesz jeden
    Oczywiście kompilator zrobi to za ciebie gdy napiszesz int x=34; x=-x;.
1

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.

0

Sory Wibowit. Masz oczywiście rację. Tylko liczby ujemne mają bit znaku. Pokaż mi kod w c++ negacji bitu znaku np. w liczbie -34.

0

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

0

@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:

  1. negacja bitu znaku
int a = 34;
a ^= INT_MIN;
  1. negacja znaku
int a = 34;
a = ~a + 1;

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