首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的位向量

问c++中的位向量
EN

Stack Overflow用户
提问于 2011-12-20 02:26:29
回答 2查看 24.9K关注 0票数 9

最近我听说了位向量,但我真的找不到关于这个主题的任何有用的信息或教程。你能推荐一本关于如何实现你自己的位向量类的书或快速教程吗?谢谢。

-/我不能发布我自己问题的答案,所以我决定编辑这篇文章。这是我刚刚找到的:“游戏程序员的数据结构--罗恩·彭顿和安德烈·拉莫斯”。第四章,位向量。这本书详细解释了位向量,以及如何自己制作位向量类。玩得开心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-20 03:29:18

这是一个非常简单的静态大小的位向量实现。它需要C++11才能工作,因为它依赖于<cstdint>头,但这个头很常见,因为它基于C99特性。在必要的情况下,您可以使用C <stdint.h>头,并简单地使用全局命名空间中的类型。

注意:这是即时输入的,根本没有经过测试。我甚至没有验证它是否会被编译。因此,可能会有错误。

代码语言:javascript
复制
#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.
}

整个my_bitvector_base的工作就是创建一种私有类型。您可以在派生类的接口或实现中提及它,因为它是protected,但您不能在其他上下文中提及它。这可以防止人们存储bitref的副本。这一点很重要,因为bitref的存在实际上只是为了允许对operator []的结果赋值,因为C++标准委员会并没有实现operator []=或类似的东西来为数组元素赋值。

正如您所看到的,位向量基本上是一个位数组。更花哨的位向量将模拟一个“无限”的位数组,这些位都被初始化为true或false。它们通过跟踪已设置的最后一位和它之前的所有位来实现这一点。如果你在那之后要求更多,他们只返回初始化值。

一个好的位向量还将实现operator &和其他类似的细节,因此它们在引用位操作操作时的行为有点像一个非常大的无符号整数。

票数 5
EN

Stack Overflow用户

发布于 2011-12-20 02:53:54

vector<​bool>是向量模板的特化。一个普通的布尔变量至少需要一个字节,但是由于一个布尔值只有两个状态,因此向量的理想实现是每个布尔值只需要一个比特。这意味着迭代器必须是特殊定义的,并且不能是bool*。

来自Bruce Eckel的思考CPP Vol-2第4章: STL容器和迭代器

这本书可以在http://www.mindviewinc.com/Books/downloads.html上免费下载,它包含了更多关于bits和C++的信息

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8565674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档