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.
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.
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 var
là 37
và bitno
là 7
. 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.
Đâ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 var
là OR
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 var
là 01000110
và bitno
là 5
rồi 1UL << 5 = 32
hoặc 00100000
sau đó
var = 01000110 | 00100000
tức var = 01100110
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 << 3
là 0000 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ú 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
Đó 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. –
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ý. –