Cześć, mam zadanie z masek bitowych, ale kompletnie nie wiem o co chodzi. Przeczytałam już różne artykuły i obejrzałam filmiki na yt, ale nie mogę zrozumieć. Może tak naprawdę to jest proste, szybkie do wytłumaczenia i ktoś mógłby mi pomóc? Z góry dzięki za wszystkie odpowiedzi
zad.
Napisz program, który pobierze od użytkownika dwie wartości typu int. Pierwsza z nich będzie liczbą całkowitą (do obliczeń). Druga będzie informacją ile bitów należy zastosować w masce (bity ustawiane od najmniejszego).
Dokonaj maskowania bitowego (wyliczoną maską) na wartości bazowej
i wyświetl wynik. Aby ustawić bity maski po kolei wykorzystaj to, że wartość pełnej potęgi dwójki pomniejszona o 1 powoduje ustawienie wszystkich poprzednich bitów („z prawej”) na stan wysoki.
// 32 – 1 = 31
// 32 = 0010 0000 // 31 = 0001 1111
Przykładowo, wprowadzono: liczba = 2022
maska = 6
wynik = 38
Liczby całkowite w C++ można interpretować jako maski bitowe (WSZYSTKIE LICZBY) -> czyli konkluzja jest taka, że każdą liczbę zapisaną w systemie dziesiętnym, możesz zamienić na system binarny i na każdym tych z bitów możesz wykonać jakąś operację logiczną np and
, xor
, or
, not
.
idąc dalej te maskowanie zrozum, jako zamiana jednej liczby na inną przy pomocy operacji logicznych - do operacji logicznych stosuje się tabele prawdy
biorąc przykład jaki podał @kq wyobraź sobie jedno z zastosowań operacji bitowych i niech będzie to taka sytuacja - że chcesz zaszyfrować sobie jawny tekst na niejawny - przykład @kq trochę zmodyfikuję i podstawię tam jakąś literę z kodu ASCII
litera A
w ASCII ma binarny odpowiednik 0100 0001
dziesiętnie 65
wymyślasz sobie dowolną tzw maskę niech będzie to 1010 0111
bierzesz w rękę tabelę prawdy i szukasz w niej AND
i jedziesz do lewej do prawej i pierwszym bitem liczby 65 jest 0
(tak naprawdę jest to dopełnienie o 8 bitów, bo liczba 65 w rzeczywistości ma 7 bitów :>)
następnie bierzesz pierwszą liczbę tzw "maski" czyli jest to liczba 1
i patrząc na tabelę prawdy wykonujesz operację logiczną AND
czyli
65-----------Maska
0-->AND----->1------>= 0
1-->AND----->0------>= 0
0-->AND----->0------>= 0
0-->AND----->0------>= 0
0-->AND----->0------>= 0
0-->AND----->1------>= 0
0-->AND----->1------>= 0
1-->AND----->1------>= 1
wynik = 0000 0001
0100 0001 //65
1010 0111 //maska
--------- //AND
0000 0001 //wynik
literka A
którą zaszyfrowałeś poddając ją operacji logicznej AND
ma teraz postać 0000 0001
PS. Operacje bitowe możesz użyć na przykład do napisania sobie prostego algorytmu szyfrowania tekstu z przesuwaniem bitowym :> (do przesuwania bitowego używasz operatora >>
lub <<
- ale na razie sobie daruj póki nie załapiesz tego co masz w zadaniu)