Na PHP documentation o JSON wymienia słowo maska bitowa. Wikipedia zdefiniowała go jako maskę. Nie rozumiem ani maski bitowej, ani maski, ani tego, jak są użyteczne. Czy ktoś może wyjaśnić te terminy za pomocą terminów laików i bez żargonu?Co to jest maska bitowa i maska?
Odpowiedz
To tylko liczba, jak przedstawiona w postaci binarnej. Na przykład, powiedzmy, mam 8 wartości logicznych (true
lub false
), które chcę zapisać. Mógłbym zapisać go jako tablicę 8-bitowych bajtów, lub mógłbym zapisać go jako pojedynczy bajt (8 bitów), z których każdy przechowuje jeden z booleanów (0
= false
, ,).
W tym miejscu mogę łatwo manipulować moim bajtem, aby móc (1) ustawić określone bity do włączenia lub wyłączenia (true lub false) i (2) sprawdzić, czy określone bity są włączone lub wyłączone.
- Aby ustawić bit 1:
mask = mask | (1 << bitIndex)
- Aby ustawić bit 0:
mask = mask & ~(1 << bitIndex)
- się nieco (aby móc je sprawdzić):
(mask & (1 << bitIndex)) != 0
Wszystko operacje te wykorzystują operator lewostronny, który przenosi bity z pozycji najmniej znaczących na najbardziej znaczące.
Bity i bajty
W komputerowych, numery są wewnętrznie reprezentowane binarnie. Oznacza to, że jeśli używasz typu integer dla zmiennej, to będzie ona wewnętrznie reprezentowana jako suma zer i jedynek.
Jak wiadomo, pojedynczy bit reprezentuje jeden 0
lub jeden. Łączenie ośmiu z tych bitów oznacza bajt, np. 00000101
, który jest numerem 5. Zakładam, że wiesz, jak liczby są reprezentowane w systemie binarnym, jeśli nie, spójrz na here.
W PHP liczba to (w większości) 4 bajty. Oznacza to, że twój numer faktycznie wykorzystuje 32 bity pamięci wewnętrznej. Ale z powodów prostotowych, w całej tej odpowiedzi użyję liczb 8-bitowych.
Zapisywanie stanów w bitach
Teraz wyobraź sobie, że chcemy stworzyć program, który utrzymuje stan, który jest oparty na wielu wartości, które są jednym (true
) lub zero (false
). Można przechowywać te wartości w różnych zmiennych, mogą to być wartości logiczne lub całkowite. Lub zamiast tego użyj pojedynczej zmiennej liczbowej i użyj każdego z jej 32-bitowych wewnętrznych bitów do reprezentowania różnych wartości true i falses.
Przykład: 00000101
. Tutaj pierwszy bit (odczyt od prawej do lewej) jest prawdziwy, co stanowi pierwszą zmienną. Drugi to fałsz, który reprezentuje drugą zmienną. Trzeci prawda. I tak dalej ...
Jest to bardzo kompaktowy sposób przechowywania danych i ma wiele zastosowań.
Bit Maskowanie
To gdzie bit maskowania przychodzi. Brzmi to skomplikowane, ale w rzeczywistości jest to bardzo proste.
Maskowanie bitów umożliwia korzystanie z operacji działających na poziomie bitowym.
- Edycja poszczególne bity bajtu (ów)
- sprawdzenie, czy poszczególne wartości bitowych jest obecne czy nie.
rzeczywiście zastosować maskę do wartości, w którym w naszym przypadku wartość jest nasze państwo 00000101
i maska jest znowu liczba binarna, która wskazuje bity zainteresowania.
Przez wykonywanie operacji binarnych na masce, a stan można osiągnąć następujące:
- operator and wyodrębnia podzestaw bitów w stanie
- OR operatora ustawia podzestaw bitów w stanie
- operator XOR przełącza podzbiór bitów w stanie
Jeśli chcemy ustawić określoną wartość true, możemy to zrobić za pomocą przycisków lub opera tor i dodaje nieco maska:
Mask: 10000000b
Value: 00000101b
---- OR ---------
Result: 10000101b
Albo można wybrać określoną wartość od państwa za pomocą operatora AND:
Mask: 00000100b
Value: 00000101b
---- AND ---------
Result: 00000100b
Proponuję trochę głębsze spojrzenie na nią i zapoznać ze żargonem. Dobrym początkiem może być link this.
Goodluck!
[Ta strona] (https://www.eskimo.com/~scs/cclass/int/sx4ab.html) może pomóc. (Uwaga: chodzi o C, nie o PHP, i może mieć zbyt wysoki żargon: stosunek liczby laika.) –
@SteveSummit bardzo dobrze przeczytać, dzięki. – Pochi