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 ⚠️:
- uwzględnić odwrócenie tzw. bitu znaku,
- 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 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 🏁!