2011-12-19 30 views
5

Gần đây tôi đã nghe về các bit bit, nhưng tôi không thể tìm thấy bất kỳ thông tin hoặc hướng dẫn hữu ích nào về chủ đề này. Bạn có thể đề nghị một cuốn sách hoặc một hướng dẫn nhanh về cách thực hiện các lớp vector bit của riêng bạn không? Cảm ơn bạn.bit vectơ trong C++

--- /// tôi không thể đăng câu trả lời cho câu hỏi của riêng mình, vì vậy tôi quyết định chỉnh sửa bài đăng này. Đây là những gì tôi vừa tìm thấy: "Cấu trúc dữ liệu cho các lập trình viên trò chơi - Ron Penton và Andre Lamothe". Chương 4, Bitvectors. Cuốn sách này đã giải thích kỹ lưỡng về các vectơ bit và cách tự tạo một lớp vectơ bit. chúc vui vẻ.

+0

Bạn muốn biết gì về vectơ * bit? Trong C++, bạn thường sử dụng 'std :: bitset' hoặc' std :: vector 'cho số này – jalf

+0

, tôi thậm chí không biết chúng hữu ích cho cái gì, vì vậy mọi thứ cũng sẽ làm) –

+0

Tôi cũng muốn biết cái gì là cơ chế bên trong của bit bit. xin lỗi vì tiếng anh xấu –

Trả lời

3

Đây là một thực thi vector bit kích thước tĩnh rất đơn giản. Nó yêu cầu C++ 11 hoạt động vì nó dựa trên tiêu đề <cstdint>, nhưng tiêu đề này khá phổ biến vì nó dựa trên tính năng C99. Trong một nhúm, bạn có thể sử dụng tiêu đề C <stdint.h> và chỉ cần sử dụng các loại trong không gian tên chung.

Lưu ý: Điều này đã được nhập khi đang di chuyển và không được thử nghiệm chút nào. Tôi thậm chí không xác minh nó sẽ biên dịch. Vì vậy, có thể có lỗi.

#include <cstdint> // ::std::uint64_t type 
#include <cstddef> // ::std::size_t type 
#include <algorithm> 

class my_bitvector_base { 
protected: 
    class bitref { // Prevent this class from being used anywhere else. 
    public: 
     bitref(::std::uint64_t &an_int, ::std::uint64_t mask) 
      : an_int_(an_int), mask_(mask) 
     { 
     } 

     const bitref &operator =(bool val) { 
     if (val) { 
      an_int_ |= mask_; 
     } else { 
      an_int_ &= ~mask_; 
     } 
     return *this; 
     } 
     const bitref &operator =(const bitref &br) { 
     return this->operator =(bool(br)); 
     } 
     operator bool() const { 
     return ((an_int_ & mask_) != 0) ? true : false; 
     } 

    private: 
     ::std::uint64_t &an_int_; 
     ::std::uint64_t mask_; 
    }; 
}; 

template < ::std::size_t Size > 
class my_bitvector : public my_bitvector_base { 
private: 
    static constexpr ::std::size_t numints = ((Size + 63)/64); 
public: 
    my_bitvector() { ::std::fill(array, array + numints, 0); } 

    bool operator [](::std::size_t bitnum) const { 
     const ::std::size_t bytenum = bit/64; 
     bitnum = bitnum % 64; 
     return ((ints_[bytenum] & (::std::uint64_t(1) << bitnum)) != 0) ? true : false; 
    } 
    bitref operator[](::std::size_t bitnum) { 
     const ::std::size_t bytenum = bit/64; 
     bitnum = bitnum % 64; 
     ::std::uint64_t mask = ::std::uint64_t(1) << bitnum; 
     return bitref(ints_[bytenum], mask); 
    } 

private: 
    ::std::uint64_t ints_[numints]; 
}; 

// Example uses 
void test() 
{ 
    my_bitvector<70> bits; // A 70 bit long bit vector initialized to all false 
    bits[1] = true; // Set bit 1 to true 
    bool abit = bits[1]; // abit should be true. 
    abit = bits[69]; // abit should be false. 
} 

Toàn bộ my_bitvector_base điều là để tạo ra một loại loại tin. Bạn có thể đề cập đến nó trong giao diện hoặc triển khai cho các lớp dẫn xuất bởi vì nó là protected, nhưng bạn không thể đề cập đến các ngữ cảnh khác. Điều này ngăn mọi người lưu trữ bản sao của bitref. Điều này quan trọng bởi vì bitref chỉ thực sự tồn tại để cho phép gán vào kết quả của operator [] vì ủy ban tiêu chuẩn C++, trong tất cả sự khôn ngoan của chúng, đã không triển khai operator []= hoặc một cái gì đó tương tự để gán cho một phần tử mảng.

Như bạn có thể thấy, một bit bit về cơ bản là một mảng bit. Các bit bit Fancier sẽ mô phỏng một mảng 'vô hạn' các bit được khởi tạo thành true hoặc false. Họ làm điều này bằng cách theo dõi bit cuối cùng đã được thiết lập và tất cả các bit trước nó. Và nếu bạn yêu cầu một chút sau đó, họ chỉ trả về giá trị khởi tạo.

Một bit bit tốt cũng sẽ thực hiện operator & và các phần tử khác như vậy để chúng hoạt động giống như một số nguyên không dấu rất lớn có tham chiếu đến thao tác bit thao tác.

1

vector < ​ bool> là chuyên môn hóa của mẫu vectơ. Một biến bool bình thường yêu cầu ít nhất một byte, nhưng kể từ khi bool chỉ có hai trạng thái, việc thực hiện lý tưởng của vectơ là như vậy mà mỗi giá trị bool chỉ yêu cầu một bit là . Điều này có nghĩa là trình lặp phải là được xác định đặc biệt và không thể là bool *.

từ Suy nghĩ CPP Vol-2 từ Bruce Eckel chương 4: Container STL & Vòng lặp

Cuốn sách này có thể được tải về miễn phí tại http://www.mindviewinc.com/Books/downloads.html và nó chứa nhiều thông tin trên bit C++