Tôi bắt đầu đọc "Lập trình ngọc trai" ngày hôm nay và trong khi thực hiện nó tập thể dục tôi đi qua câu hỏi này "Làm thế nào bạn sẽ thực hiện bit bit của riêng bạn?". Khi tôi nhìn vào giải pháp đó là như thế này:Sử dụng Mặt nạ bit trong chương trình dưới đây từ Lập trình Pearls
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];
void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK));
Nơi tôi đang nhận được nhầm lẫn tại là tuyên bố này
1 << (i & MASK)
thể ai đó hãy giải thích cho tôi những gì đang xảy ra ở đây?
Cảm ơn bạn đã trả lời Henning. Điều này có hợp lệ không nếu tôi thay thế '(i & MASK)' bằng '(i% 32)'? Nếu nó sẽ hợp lệ nhưng không thanh lịch thì bạn có thể làm sáng tỏ một số lý do tại sao 'i & MASK' được ưa thích hơn' i% 32'? Cảm ơn rất nhiều. – test123
Có - 'i & MASK' và' i% 32' là điều tương tự miễn là bạn chắc chắn 'i' không tiêu cực. Các bitwise AND thường hiệu quả hơn một bộ phận với phần còn lại, và do đó đã trở thành sự lựa chọn truyền thống. Hoặc ít nhất nó được sử dụng để trở lại hiệu quả hơn khi trình biên dịch nơi ngu ngốc. Hôm nay, bạn có thể mong đợi một trình biên dịch tối ưu vừa phải để viết lại 'i% 32' thành' i & 31' trong ngữ cảnh này (hoặc có thể chứng minh rằng 'i' không âm, trong trường hợp viết lại luôn an toàn, hoặc nó có thể lý do rằng một kết quả tiêu cực sẽ kích hoạt hành vi không xác định trong sự thay đổi anyway). –
Tuyệt. Cảm ơn rất nhiều vì lời giải thích. – test123