Maska bitowa

0

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

7

Zadanie jest dość proste. Zacznijmy od maski bitowej: w przykładzie masz ustawianie pięciu bitów korzystając z wartości, że wartość 111112 to 3110 , a to z kolei 32-1, czyli 25-1.

Inaczej mówiąc, jeśli chcesz n bitów, to liczysz sobie 2n-1.

Nie jestem pewien jaka operacja ma być wykonana maską, ale zakładam, że jest to bitowy and (∧)

Cały przykład (dla uproszczenia tylko 16 bitów)

00000111 11100110 // 2022
00000000 00111111 // 63 - maska
----------------- // and
00000000 00100110 // 38 - wynik

Teraz wystarczy, że zapiszesz to w kodzie i voilà!

2

printf("%d\n",value&((1U<<bits)-1));
specjalnie dla @enedil:
printf("%d\n",bits>=32?value:(value&((1U<<bits)-1)));

0
Pysa6 napisał(a):

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)

1

@Pysa6:

nie rozumiem jakie liczby mam wziąć jako maskę, ma to być powiedzmy 6 bitów, więc moze to być 111111 lub 100111, lub jakakolwiek inna kombinacja, czy jest to z góry założone?

W tym zadaniu — maskę masz przyjąć od użytkownika. W przyszłości — zależeć będzie od tego, co chciałeś zamaskować, po co to w ogóle robiłeś. Ogólnie celem maski jest uzyskanie pewnego interesującego cię w danym momencie wycinka informacji z jakiegoś zbiorczego ciągu danych.

Na przykład w systemach POSIX-owych (Linux, MacOS, itd.) uprawnienia do plików są zapisywane jako trzycyfrowa liczba w systemie ósemkowym — pierwsza cyfra odpowiada za uprawnienia właściciela, druga grupy właściciela, a trzecia wszystkich pozostałych. Zastanów się, jeśli chcesz, w ramach treningu, jak wyciągnąć zawsze pierwszą cyfrę (przypominam — w systemie ósemkowym!), czyli tę odpowiedzialną za uprawnienia właściciela, tak wynik zawsze był taki sam niezależnie od pozostałych cyfr — tzn. 07777, 07227, 06666, 06006, itd.

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