From 862d1754622ecfd4b502296c99982033b0423c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=BB=E9=AD=82=E5=9C=A3=E4=BD=BF?= Date: Sat, 7 Sep 2024 20:51:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=95=E5=85=A5=E4=BD=8D=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 ++ include/Bitmap.h | 37 +++++++++++++++++++++++++++++++++++++ main.cpp | 14 ++++++++++++++ src/Bitmap.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 include/Bitmap.h create mode 100644 src/Bitmap.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a8781fd..1b422d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,8 @@ add_library(DataStruct src/HeapSort.cpp include/HeapSort.h src/mutex/shared_mutex.cpp + src/Bitmap.cpp + include/Bitmap.h ) target_include_directories(DataStruct PUBLIC include) diff --git a/include/Bitmap.h b/include/Bitmap.h new file mode 100644 index 0000000..1aa452d --- /dev/null +++ b/include/Bitmap.h @@ -0,0 +1,37 @@ +// 版权所有 (c) ling 保留所有权利。 +// 除非另行说明,否则仅允许在DataStruct中使用此文件中的代码。 +// +// 由 ling 创建于 24-9-7. +// + +#ifndef DATASTRUCT_BITMAP_H_48 +#define DATASTRUCT_BITMAP_H_48 + +#include +#include + +namespace ling { + /** + * 位图 + */ + class Bitmap { + private: + size_t size; + int32_t *buf; + public: + explicit Bitmap(size_t size); + + virtual ~Bitmap(); + + bool test(size_t index) const; + + void set(size_t index); + + void clear(size_t index); + + size_t getSize() const; + }; + +} // ling + +#endif //DATASTRUCT_BITMAP_H_48 diff --git a/main.cpp b/main.cpp index 5b40df2..dc8d44b 100644 --- a/main.cpp +++ b/main.cpp @@ -6,6 +6,7 @@ #include #include #include +#include class RedBlackTree : public ling::RedBlackTree { protected: @@ -257,3 +258,16 @@ TEST(红黑树, 搜索测试) { ASSERT_FALSE(node == nullptr); ASSERT_EQ(node->value, 50); } + +TEST(位图, 位图测试) { + ling::Bitmap bitmap(100); + for (int i = 0; i < bitmap.getSize(); i++) + ASSERT_FALSE(bitmap.test(i)) << "i = " << i; + bitmap.set(20); + ASSERT_TRUE(bitmap.test(20)); + ASSERT_FALSE(bitmap.test(19)); + ASSERT_FALSE(bitmap.test(21)); + bitmap.clear(20); + for (int i = 0; i < bitmap.getSize(); i++) + ASSERT_FALSE(bitmap.test(i)); +} \ No newline at end of file diff --git a/src/Bitmap.cpp b/src/Bitmap.cpp new file mode 100644 index 0000000..5b6d467 --- /dev/null +++ b/src/Bitmap.cpp @@ -0,0 +1,41 @@ +// 版权所有 (c) ling 保留所有权利。 +// 除非另行说明,否则仅允许在DataStruct中使用此文件中的代码。 +// +// 由 ling 创建于 24-9-7. +// + +#include +#include +#include "Bitmap.h" + +#define BYTE_TO_BIT(byte) (sizeof(byte)*8) + +namespace ling { + Bitmap::Bitmap(size_t size) { + this->size = size; + size_t len = size / BYTE_TO_BIT(int32_t) + 1; + this->buf = new int32_t[len]; + memset(this->buf, 0, len * sizeof(int32_t)); + } + + Bitmap::~Bitmap() { + delete[] this->buf; + } + + bool Bitmap::test(size_t index) const { + return this->buf[index / BYTE_TO_BIT(int32_t)] & (1 << (index % BYTE_TO_BIT(int32_t))); + } + + void Bitmap::set(size_t index) { + //不进行溢出检测,调用方有义务保证index在索引范围内 + this->buf[index / BYTE_TO_BIT(int32_t)] |= (1 << (index % BYTE_TO_BIT(int32_t))); + } + + void Bitmap::clear(size_t index) { + this->buf[index / BYTE_TO_BIT(int32_t)] &= ~(1 << (index % BYTE_TO_BIT(int32_t))); + } + + size_t Bitmap::getSize() const { + return this->size; + } +} // ling \ No newline at end of file