„Wartość” wynosi od 0 do 15 (możliwe wartości). Kiedy te 4 warunki „jeśli” zostaną spełnione? Jeśli moja (int) wartość = 2, czy to oznacza 0010?
if ((int)value & 0x1)
{
//statement here
}
if ((int)value & 0x2)
{
//statement here
}
if ((int)value & 0x4)
{
//statement here
}
if ((int)value & 0x8)
{
//statement here
}
c++
bitwise-operators
Sean McCarthy
źródło
źródło
value
(czytaneif(value & 0x4)
jako „Czy trzeci bitvalue
zestawu (= 1)). Ponieważ pozornie masz problemy ze zrozumieniem kodu, zakładam, że nie jest on twój. To (i fakt, że nie pytasz do wglądu) sprawia, że to pytanie off-topic dla CR.SE .Enum.HasFlag
metody do testowania bitów. Zobacz: Enum.HasFlag .Odpowiedzi:
Każda liczba może być wyrażona jak
value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...
przy każdym b będącym jednym0
lub1
(są to bity reprezentacji). To jest reprezentacja binarna.Binarny AND (
&
) sprawia, że każda z tychb
par jest mądra i wykonuje AND. Ma to następujące wyniki:Używając potęg 2 (które mają tylko jeden bit), możemy wyizolować i przetestować poszczególne bity:
value & 1
jest prawdziwe, gdyvalue
jest nieparzysty {1, 3, 5, 7, 9, 11, 13, 15}.value & 2
jest prawdziwe, gdyvalue/2
jest nieparzysty {2, 3, 6, 7, 10, 11, 14, 15}.value & 4
jest prawdziwe, gdyvalue/4
jest nieparzysty {4, 5, 6, 7, 12, 13, 14, 15}.value & 8
jest prawdziwe, gdyvalue/8
jest nieparzyste {8, 9, 10, 11, 12, 13, 14, 15}.Prefiks 0x na liczbach oznacza, że należy go interpretować jako liczbę szesnastkową . Jest to trochę zbędne, gdy wchodzisz tylko do 0x8, ale mówi opiekunom, że prawdopodobnie jest używany jako maska bitowa.
źródło
8/6
jest nieparzyste, a8&6
daje fałsz.Te instrukcje if sprawdzają, czy określony bit
value
jest ustawiony.Na
0x4
przykład wartość szesnastkowa ma trzeci bit od prawego zestawu do1
i wszystkie inne bity ustawione na0
. Gdy użyjesz operatora binarnego i operatora (&
) z dwoma operantami, w wyniku zostaną ustawione wszystkie bity z0
wyjątkiem bitów, które mają 1 w obu operantach.Więc kiedy wykonujesz obliczenia
value & 0x4
, dostajesz binarny00000000
lub binarny00000100
, w zależności od tego, czy trzeci bitvalue
jest,1
czy nie0
. Pierwszy ocenia nafalse
, a drugi natrue
, więc blok if jest wykonywany tylko dla wartości, dla których ustawiony jest trzeci bit.źródło
Warto tu zwrócić uwagę na dwie interesujące rzeczy.
Po pierwsze, jest to powszechny wzorzec sprawdzania każdego z 4 bitów niższego rzędu o wartości całkowitej. Warunek if jest spełniony, jeśli ustawiony jest odpowiedni bit. Dla wartości 2 wzorzec bitowy jest rzeczywiście 0010.
Innym bardziej interesującym pytaniem jest dlaczego
(int)
obsada? Poza złym stylem używania rzutowań C w C ++, żadne wartości całkowite ani znaki nie wymagają tego rzutowania. Bool nie ma sensu, podwójny / zmiennoprzecinkowy zostałby przekonwertowany na liczbę całkowitą tymczasową i byłoby rzadkością używać literałów do testowania wyliczenia. Może to mieć sens ze wskaźnikiem, ale byłoby to bardzo wyspecjalizowane zastosowanie. Wniosek: obsada nie ma sensu.źródło