Để truy cập ngẫu nhiên các bit riêng lẻ, macro bạn đã đề xuất là tốt như bạn sẽ nhận được (miễn là bạn bật tối ưu hóa trong trình biên dịch của mình).
Nếu có bất kỳ mẫu nào ở tất cả các bit bạn đang truy cập, thì bạn có thể làm tốt hơn. Ví dụ: nếu bạn thường truy cập cặp bit, thì bạn có thể thấy một số cải tiến bằng cách cung cấp một phương thức để nhận hai bit thay vì một bit, ngay cả khi bạn không phải lúc nào cũng sử dụng cả hai bit. Cũng như với bất kỳ vấn đề tối ưu hóa nào, bạn sẽ cần phải rất quen thuộc với hành vi mã của bạn, đặc biệt là các mẫu truy cập của nó trong mảng bit của bạn, để cải thiện hiệu suất có ý nghĩa.
Cập nhật: Vì bạn truy cập vào phạm vi bit, bạn có thể có thể siết chặt hiệu suất hơn trong số các macro của mình. Ví dụ, nếu bạn cần truy cập Bốn bit bạn có thể có các macro như thế này:
#define GETBITS_0_4(x,in) (((in)[(x)/8] & 0x0f))
#define GETBITS_1_4(x,in) (((in)[(x)/8] & 0x1e) >> 1)
#define GETBITS_2_4(x,in) (((in)[(x)/8] & 0x3c) >> 2)
#define GETBITS_3_4(x,in) (((in)[(x)/8] & 0x78) >> 3)
#define GETBITS_4_4(x,in) (((in)[(x)/8] & 0xf0) >> 4)
#define GETBITS_5_4(x,in) ((((in)[(x)/8] & 0xe0) >> 5) | (((in)[(x)/8+1] & 0x01)) << 3)
#define GETBITS_6_4(x,in) ((((in)[(x)/8] & 0xc0) >> 6) | (((in)[(x)/8+1] & 0x03)) << 2)
#define GETBITS_7_4(x,in) ((((in)[(x)/8] & 0x80) >> 7) | (((in)[(x)/8+1] & 0x07)) << 1)
// ...etc
Những macro sẽ cắt ra bốn bit từ mỗi vị trí bit 0, 1, 2, vv (Để giảm sự gia tăng ngoặc vô nghĩa, bạn có thể muốn sử dụng chức năng inline cho ở trên) Sau đó, có lẽ định nghĩa một hàm nội tuyến như:.
inline int GETBITS_4(int x, unsigned char *in) {
switch (x % 8) {
case 0: return GETBITS_0_4(x,in);
case 1: return GETBITS_1_4(x,in);
case 2: return GETBITS_2_4(x,in);
// ...etc
}
}
Do đây là rất nhiều mã boilerplate tẻ nhạt, đặc biệt là nếu bạn đã có nhiều độ rộng khác nhau , bạn có thể muốn viết chương trình để tạo tất cả các hàm truy cập GETBIT_*
.
(Tôi nhận thấy rằng các bit trong byte của bạn được lưu trữ theo thứ tự ngược lại từ những gì tôi đã viết ở trên. Áp dụng một chuyển đổi thích hợp để phù hợp với cấu trúc của bạn nếu bạn cần.)
Tôi biết có một số biến thể về số lượng bit trên mỗi char, nhưng 256 bit trên mỗi char là một _lot_. – MSalters
Các phiên dịch: cảm ơn, cố định. –