gpt4 book ai didi

c++ - C++中的位 vector

转载 作者:行者123 更新时间:2023-12-04 11:58:10 28 4
gpt4 key购买 nike

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

5年前关闭。




Improve this question




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

---///我无法发布自己问题的答案,所以我决定编辑这篇文章。这是我刚刚发现的内容:“游戏程序员的数据结构 - Ron Penton 和 Andre Lamothe”。第 4 章,位 vector 。这本书对位 vector 进行了详尽的解释,以及如何自己制作位 vector 类。玩得开心。

最佳答案

这是一个非常简单的静态大小的位 vector 实现。它需要 C++11 才能运行,因为它依赖于 <cstdint> header ,但此 header 相当常见,因为它基于 C99 功能。在紧要关头,您可以使用 C <stdint.h> header 并简单地使用全局命名空间中的类型。

注:这是即时输入的,根本没有经过测试。我什至没有验证它会编译。所以,可能会有错误。

#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事情是创建一种私有(private)类型。您可以在派生类的接口(interface)或实现中提及它,因为它是 protected ,但您不能在其他上下文中提及它。这可以防止人们存储 bitref 的拷贝。 .这很重要,因为 bitref仅真正存在以允许分配给 operator [] 的结果因为 C++ 标准委员会,尽其所能,还没有实现 operator []=或用于分配给数组元素的类似内容。

如您所见,位 vector 基本上是位数组。更高级的位 vector 将模拟一个“无限”位数组,全部初始化为真或假。他们通过跟踪已设置的最后一位和之前的所有位来做到这一点。如果您在那之后要求一点,他们只会返回初始化值。

一个好的位 vector 也将实现 operator &和其他这样的细节,所以它们在位操作操作方面表现得有点像一个非常大的无符号整数。

关于c++ - C++中的位 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8565674/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com