2013-01-22 19 views
7

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ę.

+1

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

+0

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ć. –

+0

Możesz zostać rzucony przez rzadko używany "1UL", który jest po prostu literałem 1 w niepodpisanej długiej formie. –

Odpowiedz

13

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 var37 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.

2

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

+3

Jak przepisanie kodu odpowiada na pytanie? – nico

+0

@nico Po prostu rywalizuję z innymi. –

+0

nie wiedział, że to konkurs – nico

0

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.