Przedstawiam Ci kolejny operator bitowy. Negacja bitowa w programowaniu to operacja NOT na pojedynczych bitach! Zapraszam do środka i zobacz jak to wygląda krok po kroku, a szybko się przekonasz, jak bardzo się mylisz myśląc, że to bułka z masłem 😱!

NEGACJA BITOWA W PROGRAMOWANIU, CZYLI OPERACJA "NOT"..."PO BITOWEMU"

Negacja bitowa, "bitwise NOT", "bitwise complementary" ℹ️. Te trzy 3️⃣ określenia dotyczą tego samego. Operator bitowy odwracający wartości bitów liczby całkowitej ✔️. Jedyny z operatorów bitowych, który przyjmuje tylko jeden operand (argument), rodzynek jeden 😆.

Wbrew pozorom, jest to najbardziej podchwytliwy ze wszystkich operatorów bitowych! W negacji "zwykłej", że się tak wyrażę, jest po prostu odwrócenie wartości logicznej wyrażenia i tyle 😉. Kiedy jednak w grę wchodzi operowanie na bitach, sprawa robi się dużo bardziej skomplikowana niż przy koniunkcji, alternatywie i alternatywie wykluczającej!

Obejdzie się bez przykładu zastosowania, jako że poza samym faktycznym odwracaniem bitów do góry brzuchem 🤣, nie ma takiego praktycznego przykładu do użycia gdzieś w projekcie 😜. To również jeden z najrzadziej używanych operatorów.

Przykład obliczania

To jest operator jednoargumentowy, zatem wystarczy że weźmiesz sobie jedną liczbę całkowitą np. 45 i zamienisz na system dwójkowy:

1 0 1 1 0 1

I teraz uwaga! W tym miejscu musimy zastosować negację wszystkich bitów, czyli zera odwracamy na jedynki, a jedynki na zera. Proste, nie 😄?

0 1 0 0 1 0

Tylko, że...to nie wystarczy ⛔! Aby prawidłowo przeprowadzić negację bitową, musisz zrobić dwa dodatkowe kroki ⚠️:

  1. uwzględnić odwrócenie tzw. bitu znaku,
  2. do wyniku dodać jedynkę.

Podzielmy sobie te kroki 🚶.

Bit znaku

Bit znaku to bit o specjalnym znaczeniu podczas negowania bitów. Komputer sam w sobie nie zna czegoś takiego, jak wartość ujemna i nie ma jak sobie "postawić" minusik obok liczby, tak jak my to robimy w matmie 😆.

Żeby można było odróżnić wartość dodatnią od ujemnej, wprowadzono tzw. bit znaku ℹ️, który w zależności od jego wartości, określa on znak całej wartości liczbowej.

Bit znaku oznacza:

  • liczbę dodatnią, jeśli bit przyjmuje wartość 0 (zero),
  • liczbę ujemną, jeśli bit przyjmuje wartość 1 (jeden).

Bit znaku jest zawsze jednocześnie najbardziej znaczącym bitem (ang. least significant bit) tzn. będącym najbardziej wysuniętym od lewej strony. Tylko tu też uwaga na pułapkę ⚠️!

Weź sobie jeszcze raz tę liczbę:

1 0 1 1 0 1

To jest te same 45 w postaci dwójkowej. Jeżeli myślisz, że bit znaku to ten pierwszy od lewej strony, to jesteś w błędzie!

Musimy go sobie "dopisać" od lewej strony:

0 1 0 1 1 0 1

To jest bit znaku!!! Jeżeli przeczytałeś(-aś) ze zrozumieniem poprzedni akapit, to już wiesz dlaczego tu też musi być zero - gdyż to jest liczba dodatnia ➕!

A teraz zanegowana wartość. Wszystko tak samo, jak poprzednio...z jednym małym wyjątkiem od lewej strony:

1 0 1 0 0 1 0

Teraz jedyneczka 1️⃣, gdyż negujemy WSZYSTKIE bity bez wyjątku!

Teraz dopiero możemy zabrać się za obliczenie!

To nie wszystkie "ceregiele" jakie przynosi bit znaku 😁. Zapamiętaj jedno: jeżeli w grę wchodzi konwersja na system dziesiętny z bitem znaku, to ZAWSZE jest to składnik ujemny!!!

Sprowadzając nasze obliczenia do sumy składników, oznacza to tyle:

-26 + 24 + 21 = -64 + 16 + 1 = -47

To nie jest jeszcze wynik ostateczny! Przechodzimy do kroku drugiego!

Dodanie jedynki do wyniku

Kiedy mamy nasze wyliczenie z bitem znaku, musimy do niego dodać małe +1 na końcu ➕1️⃣:

-47 + 1 = -46

To jest dopiero koniec 😅! Dodajemy jedynkę do sumy dlatego, iż zgodnie z kodem uzupełnień do dwóch (zwanym też kodem U2), jednym z kroków podczas zamiany na liczbę przeciwną jest zwiększenie wyniku o 1.

Wzór na wynik negacji

Na bonus w gratisie pokażę Ci dziecinnie prosty wzór na wynik negacji dowolnej liczby całkowitej 👇:

~x = -(x + 1)

Jeżeli chcesz sobie poćwiczyć samodzielne obliczanie wyniku ręcznie, możesz potem ułożyć sobie równanie i sprawdzić czy lewa strona równa się prawej 😊.

Przykład kodu źródłowego

Standardowo, mały kod w języku C, abyś wiedział(a) jak negacja bitowa jest stosowana w kodzie:

#include 

int main(void)
{
	int binaryNOT = ~45;

	printf("%d\n", binaryNOT);

	return 0;
}

Tylda (~) - to jest znak negacji bitowej w większości języków wysokiego poziomu. I z racji tego, że jest to operator unarny (przyjmuje tylko jedną liczbę), wstawiamy go zaraz za liczbą całkowitą.

Gdyby Cię interesowało jakie jeszcze występują operatory bitowe, zerknij na poniższe:

  • Koniunkcja bitowa (bity wyniku przyjmują wartość 1 <=> bity wszystkich zdań przyjmują wartość 1),
  • Alternatywa bitowa (bity wyniku przyjmują wartość 1 <=> bity któregokolwiek ze zdań przyjmują wartość 1),
  • Bitowa alternatywa rozłączna (bity wyniku przyjmują wartość 1 <=> bity w nieparzystej liczbie zdań przyjmują wartość 1),
  • Negacja bitowa (wszystkie bity zostają odwrócone z uwzględnieniem działania bitu znaku) 👈 obecnie rozpatrujemy ten.
Negacja bitowa w programowaniu

Negacja bitowa zamienia wartości wszystkich bitów na przeciwne z uwzględnieniem bitu znaku. Wartość zanegowanej liczby jest postaci kodu uzupełnień do dwóch zwiększonej o jeden.


Temat wyjaśniony, materiał dobiegł końca 🏁!

PODOBNE ARTYKUŁY