2015-07-22 41 views
14

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?

+1

[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.) –

+0

@SteveSummit bardzo dobrze przeczytać, dzięki. – Pochi

Odpowiedz

8

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.

43

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!