Czy ktoś może wyjaśnić następującą składnię?Ustawienie bitów w Ansi C
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
wiem ustawia bity var
, ale nie mogę zrozumieć składnię.
Czy ktoś może wyjaśnić następującą składnię?Ustawienie bitów w Ansi C
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
wiem ustawia bity var
, ale nie mogę zrozumieć składnię.
Złammy go kawałek po kawałku:
1UL
jest unsigned long int
o wartości 1 przedstawiony na poziomie bitów, jak:
00000000000000000000000000000001
<<
jest operatorem „bit przesunięcia”, która przesunie wszystkie bity o tę wartość powyżej po lewej stronie w liczbie bitno
. Jeśli to 1UL<<5
, będziesz skończyć z:
00000000000000000000000000100000
Po tej wartości, |=
(co jest bitwise OR operation z cesją) będzie zasadniczo wymusić trochę var
, który jest zgodny z tym 1
być a 1
i wcale nie dotykają innych bitów ponieważ (X | 0 = X
)
Umożliwia to znaczy var
37
i bitno
jest 7
. Wtedy wszystko na poziomie bitowym będzie wyglądać następująco:
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
Wreszcie, w przypadku gdy nie jest jasne, #define
znaki Bitset
jako function-like macro.
To jest makro. Ilekroć preprocesor natrafi oświadczenie jak Bitset(var,bitno)
wiernie zastępuje go
var = var | 1UL << (bitno)
Dalsze wyjaśnić to.
UL tutaj oznacza Bez znaku długi.
Operator |
jest używany do operacji bitwise OR
. tak zmienna var
jest OR
ed z 1UL << bitno
i przypisany z powrotem do var
wówczas podczas wykonywania lub kompilacji w zależności od charakteru programu,
Say var
jest 01000110
i bitno
jest 5
następnie 1UL << 5 = 32
lub 00100000
następnie
var = 01000110 | 00100000
tj var = 01100110
Say var = 8, to 0000 1000
binarnie.
Jeśli nie
8 | 16
trzeba będzie 0000 1000 | 0001 0000
które dadzą Ci 0001 1000
, ponieważ operator |
ustawia bit albo jeśli bit jest 1.
Więc starasz operatora |
do swojej wartości i 1<<n
, czyli 0000 0001
przesunięte z n bitów w lewo.
Na przykład 1 << 3
to 0000 0001 << 2 = 0000 0100
.
W istocie: wykonanie Bitset(8,3)
spowoduje wygenerowanie maski z tylko trzecim bitem ustawionym przez wykonanie 1 << 3
, uzyskanie 0000 0100
. Wtedy "lub" ta maska na 8, dając: 0000 1000 | 0000 0100
, w wyniku czego 0000 1100
, czyli ustawić 3 bit 8.
Składnia składa się z całkowicie niepozornych operatorów C. Nic niezwykłego w tym. Co dokładnie chcesz wyjaśnić? Jeśli nie znasz znaczenia podstawowych operatorów C, jest to coś, co możesz przeczytać w * książce *. To nie jest miejsce, w którym można "wyjaśniać składnię ogólnego wyrażenia w C". Jeśli masz problem ze zrozumieniem czegoś konkretnego, musisz powiedzieć, co to jest. – AnT
To makro. Zastąp nazwę makra "Bitset" następującymi znakami, zastępując parametry pozycyjne makra "var" i "bitno". Pozbądź się niepotrzebnych parenów, aby lepiej to zrozumieć. –
Możesz zostać rzucony przez rzadko używany "1UL", który jest po prostu literałem 1 w niepodpisanej długiej formie. –