2013-01-22 36 views
7

Có ai có thể giải thích cú pháp sau không?Cài đặt bit trong Ansi C

#define Bitset(var,bitno) ((var) |=1UL<<(bitno)) 

Tôi biết nó đặt các bit của var, nhưng tôi không thể hiểu cú pháp.

+1

Cú pháp bao gồm các toán tử C hoàn toàn không đáng kể. Không có gì bất thường về nó. Chính xác những gì bạn muốn giải thích? Nếu bạn không biết ý nghĩa của các toán tử C cơ bản, đó là điều bạn có thể đọc trong một cuốn sách *. Đây không phải là nơi cho "giải thích cú pháp biểu thức chung trong C" câu hỏi. Nếu bạn có một vấn đề hiểu một cái gì đó cụ thể, sau đó bạn phải nói nó là gì. – AnT

+0

Đó là một macro. Thay thế tên macro "Bitset" bằng các ký tự theo sau, thay thế các tham số vị trí của macro cho "var" và "bitno". Loại bỏ các parens không cần thiết để hiểu nó tốt hơn. –

+0

Bạn có thể bị ném bởi "1UL" hiếm khi được sử dụng, mà chỉ là chữ 1 trong dạng dài chưa ký. –

Trả lời

13

Hãy phá vỡ nó xuống, từng mảnh:

1UL là một unsigned long int với giá trị là 1 đại diện ở cấp độ bit như:

00000000000000000000000000000001 

các << là một nhà điều hành "chút thay đổi" mà sẽ di chuyển tất cả các bit trong giá trị đó ở trên sang bên trái số bitno. Nếu đó là 1UL<<5, bạn sẽ kết thúc với:

00000000000000000000000000100000 

Một khi bạn có giá trị này, các |= (mà là một bitwise OR operation với một bài tập) về cơ bản sẽ buộc các bit của var đó là phù hợp với 1 rằng để trở thành một 1 và liên lạc sẽ không bất kỳ bit khác bởi vì (X | 0 = X)

phép nói rằng var37bitno7. Sau đó, tất cả mọi thứ ở cấp độ bit sẽ trông như thế này:

00000000000000000000000000100101 // var 
00000000000000000000000010000000 // 1UL<<7 

00000000000000000000000010100101 // var | (1UL<<7) 

Cuối cùng, trong trường hợp nó không phải là rõ ràng, các #define dấu Bitset như một function-like macro.

2

Đây là macro. Bất cứ khi nào Preprocessor lượt truy cập một tuyên bố như Bitset(var,bitno) nó một cách trung thực thay thế nó bằng

var = var | 1UL << (bitno) 

Tiếp tục để giải thích điều này.

UL ở đây có nghĩa là Unsigned Long.

Nhà điều hành | được sử dụng cho hoạt động bitwise OR. vì vậy các biến varOR ed với 1UL << bitno và giao lại var

Sau đó, trong runtime hoặc biên dịch thời gian tuỳ theo tính chất của chương trình,

Say var01000110bitno5

rồi 1UL << 5 = 32 hoặc 00100000

sau đó

var = 01000110 | 00100000 

tức var = 01100110

+3

Cách viết lại mã trả lời câu hỏi? – nico

+0

@nico Tôi chỉ đang cạnh tranh với những người khác. –

+0

không biết đó là cuộc thi – nico

0

Say var = 8, đó là 0000 1000 ở dạng nhị phân.

Nếu bạn làm

8 | 16 bạn sẽ có 0000 1000 | 0001 0000 mà sẽ cung cấp cho bạn 0001 1000, bởi vì các nhà điều hành | đặt bit nếu một trong hai bit là 1.

Vì vậy, bạn đang áp dụng các nhà điều hành | để giá trị của bạn và 1<<n, tức là 0000 0001 dịch chuyển các bit n sang trái.

Ví dụ: 1 << 30000 0001 << 2 = 0000 0100.

Về bản chất: làm Bitset(8,3) sẽ tạo ra một mặt nạ chỉ có các bit thứ ba thiết lập bằng cách làm 1 << 3, nhận 0000 0100. Sau đó, nó sẽ "hoặc" mặt nạ này thành 8, cho: 0000 1000 | 0000 0100, dẫn đến 0000 1100, tức là bạn đặt bit thứ 3 là 8.

Các vấn đề liên quan