自己写了一个c++ bitset,功能非常齐全!

[C++] 用bitset代替bool数组的性能测试以及bitset的基本使用 文章目录bitset介绍使用¶头文件¶指定大小¶构造函数¶运算符¶成员函数¶应用¶算法样例题bitset与埃氏筛结合埃氏筛速度测试 bitset 介绍 std::bitset 是标准库中的一个存储 0/1 的大小不可变容器。严格来讲,它并不属于 STL。 bitset 并不属于 STL,而是一种标准库中的 “Special Container”。事实上,它作为一种容器,也并不满足 STL 容器的要求。说它是适配器,它也并不依赖于其它 STL 容器作为底层实现。——摘自《The C++ Standard L 阅读详情

c++ bitset用途很广,而理解它的最好方式莫过于自己写一个,重新造轮子还是非常有乐趣的,废话不多说了,贴代码。
首先是一些必要的函数,封装在名字空间mystd里面。
/*如果发现有bug,望高手批评指正!相互交流交流!
* 转载本文的注明一下出处,谢谢!
*/

#ifndef MYSTD_BIT_OPERATION_H
#define MYSTD_BIT_OPERATION_H
#include<cstddef>
#include<cassert>


#ifdef __cplusplus
namespace mystd{
	typedef std::size_t size_type;

     unsigned char get_true(size_type index) // 1 - 8
	{
		assert(index >= 1 && index <= 8);
		return (unsigned char)1 << (index - 1) ;
		// 得到形如00010000这样的数
	}
	 unsigned char get_false(size_type index)
	{
		assert(index >= 1 && index <= 8);
		return ~get_true(index);
		// 得到形如11101111这样的数
	}

	void set_false(unsigned char& val,size_type index) // index (1 - 8)
	{
		assert(index >= 1 && index <= 8);
		val &= get_false(index);
	}
	void set_true( unsigned char& val,size_type index) // index (1 - 8) 
	{
		assert(index >= 1 && index <= 8);
		val |= get_true(index);
	}

	void* set(void* ptr,size_type pos,bool val = true)
	{   //一般性的函数,处理数组中单个值的单个bit的设定
		assert(ptr != 0);
		unsigned char *pointer = (unsigned char*)ptr;
		size_type subpos = (pos + 7)/ 8 - 1; 
		size_type index = (pos + 7) % 8  + 1;
		if(val)
			set_true(pointer[subpos],index);
		else
			set_false(pointer[subpos],index);
		return ptr;
	}

	bool read(void *ptr,size_type pos) 
	{
		assert(ptr != 0);
		unsigned char *pointer = (unsigned char*)ptr;
		size_type subpos = (pos + 7)/ 8 - 1;  
		size_type index = (pos  + 7) % 8 + 1;
		unsigned char tmp_val = (pointer[subpos] >> (index - 1) ) & unsigned char(1) ;
		return tmp_val > 0;
	}

} // end of namespace mystd 
#endif // __cplusplus
#endif // MYSTD_BIT_OPERATION_H

下面进入正文,bitset封装在名字空间mystd里面,注释说明的还算详细,贴代码!

文件名    bitset.h



/*如果发现有bug,望高手批评指正!相互交流交流!
* 转载本文的注明一下出处,谢谢!
*/

#ifndef MYSTD_BITSET_TEST_H
#define MYSTD_BITSET_TEST_H
#include"bit_operation.h"  //read ,set函数
#include<cassert>  // assert
#include<cstddef>   // std::size_t
#include<string>   // std::string 
#include<cstring>   // std::memset
#include<exception>   
#include<iostream>    

#ifdef __cplusplus

namespace mystd{
	class  invalid_argument_1{};

	template<std::size_t N>
	class bitset{
	private:
		typedef bitset self;
		typedef std::size_t size_type;
		typedef unsigned long ULONG;
		typedef unsigned long long ULLONG;
		typedef unsigned char UCHAR;
	private:
		class ref{  //写一个辅助类,因为c++无法对单个的位进行索引,
	    // c++之父在<<c++程序设计语言>>(十周年纪念版436页)中有提到这一技术,但是只有接口,没有实现,
		// 这个是我的一个实现,当然接口不太一样,我有所改变
		private:
			typedef std::size_t size_type;
			typedef ref self;
			UCHAR *head;
			size_type position;
		public:
			ref(UCHAR* tmp_ptr,size_type pos):head(tmp_ptr),position(pos)
			{
			}
		public:
			self& operator = (const self& tmp)
			{//mystd::set的pos以1开始计数,因此加1,以下都是如此
				mystd::set(head,position+1,mystd::read(tmp.head,tmp.position+1));
				return *this;
			}
			self& operator = (const bool& tmp)
			{
				assert(head != 0);
				mystd::set(head,position + 1,tmp);
				return *this;
			}
			bool operator == (const bool& tmp) const 
			{
				assert(head != 0);
				return mystd::read(head,position + 1) == tmp;
			}
			bool operator != (const bool& tmp) const
			{
			    assert(head != 0);
				return !(*this == tmp);
			}
			bool operator == (const self& tmp) const 
			{
				assert(head != 0);
				return mystd::read(head,position + 1) == 
					mystd::read(tmp.head,tmp.position + 1);
			}
			bool operator != (const self& tmp) const 
			{
              return !(*this == tmp);
			}
			
			friend std::ostream& operator << (std::ostream& os,const self& tmp)
			{
				return os << mystd::read(const_cast<UCHAR*>(tmp.head),tmp.position + 1);
			}
			friend std::istream& operator >> (std::istream& is,self& tmp)
			{ // 标准库无此功能,感觉应该加上,个人见解,呵呵!
				bool tmp_val = false;
				is>>tmp_val;
				mystd::set(tmp.head,tmp.position + 1,tmp_val);
				return is;
			}
		};

	private:
		typedef ref reference;
		typedef const ref const_reference;
		static const size_type SIZE = N;
		UCHAR *head;
	private:   //内部使用的一些函数
		bool read(void *ptr,size_type pos) const   // 从0开始
		{ // mystd里的read以1开始计数,在这里转换下,以下同理可得
			return mystd::read(ptr,pos+1);
		}
		void* set(void* ptr,size_type pos,bool val = true) const  // 从0开始
		{ //从逻辑上讲,不应该用const,为了通用性,加了个const
		  // 也可以另外写一个非const版本
			return mystd::set(ptr,pos+1,val);
		}
		size_type get_pos(size_type pos) const   // 从0开始
		{ // 举例说明,低位到高位假如有10位1000 0001 11 则最后一位getpos的结果为1,
			// 是第二个字节,getsub则是1
			return pos / 8;
		}
		size_type get_sub(size_type pos) const   // 从0开始
		{  // 
			return pos % 8;
		}
		// 计算有效位数,由低位到高位,如11010000有效位为4位
		size_type get_num_count() const 
		{
			size_type m_count = 0;
			for(size_type i = size(); i >= 1; )
				if(test(--i))
					break;
				else
					++m_count;
			return size() - m_count;
		}
		void zero_last() //将最后剩余位清零
		{  //如,有4位1101,但是分配的是一个字节,最后的4位无用,清零
			size_type cur_pos = get_pos(size());
			size_type cur_sub = get_sub(size());
			++cur_sub;
			for(size_type i = cur_sub; i < 8; ++i)
				set(&head[cur_pos],i,false);
		}
		void fill(size_type first,size_type last,bool val = false) 
		{  // 对区间[first,last)内的位进行填充
			assert(first >= 0 && last <= size());
			for(size_type i = first; i < last; ++i)
				set(i,val);  // 成员函数
		}
		void copy_left(size_type des,size_type beg,size_type end)
		{  // 区间[beg,end);
			assert(des >= 0 && des <= beg);
			if(des == beg)  // 移动0位的情况
				return ;
			while(beg != end)
				set(des++,test(beg++));
		}
		void copy_right(size_type des,size_type beg,size_type end)
		{  // 向后复制,des为末端位置加 1
		   assert(des >= end && des <= size());
		   if(end == size())   // 移动0位的情况
			   return ;
		   while(end != beg)
			   set(--des,test(--end));
		}
	public:
		bitset()  
			try:head(0)   
		{  //计算分配的字节数,如SIZE 为10则分配2个字节就可以了,剩余6位。(16-10)
			// 以下同理可得
			head = new UCHAR[get_pos(size()) + 1];
			std::memset(head,0,get_pos(size()) + 1); // 
		}
		catch(...)
		{
#ifdef _DEBUG
    std::cerr<<"out of memory"<<std::endl;
#endif
		}
		explicit bitset(ULONG val)    // unsigned long 版本
			try:head(0)
		{
			head = new UCHAR[get_pos(size()) + 1];
			std::memset(head,0,get_pos(size()) + 1); // 
			for(size_type i = 0; i < size() && i < sizeof(ULONG) * 8; ++i)
				set(i,read(&val,i));
		}
		catch(...)
		{
#ifdef _DEBUG
    std::cerr<<"out of memory"<<std::endl;
#endif
		}
		explicit bitset(const std::string& str,size_type pos = 0,size_type n = std::string::npos)
			try:head(0)
		{
			
			head = new UCHAR[get_pos(size()) + 1];
			std::memset(head,0,get_pos(size()) + 1); // 
			assert(n == std::string::npos || pos + n < str.size());
			if(pos + n > str.size())
				n = str.size() - pos;
			for(size_type i = 0,j = pos + n; i < size() && j >= pos + 1; )
			{
				assert(str[j-1] == '0' || str[j-1] == '1');
#ifdef NDEBUG
				if(str[j-1] != '0' && str[j-1] != '1')
					throw mystd::invalid_argument_1();  //非法参数,抛出异常
#endif
				set(head,i++,str[--j] == '1');
			}
		}
		catch(...)
		{
#ifdef _DEBUG
    std::cerr<<"out of memory"<<std::endl;
#endif
		}
		 //复制构造函数
		 bitset(const self& temp):head(0)
		{
			head = new UCHAR[get_pos(size()) + 1];
			std::memcpy(head,temp.head,get_pos(size()) + 1);
		}
		self& operator = (const self& temp)  //复制赋值
		{    // 直接覆盖,这里不用先释放资源,因为类型一致,SIZE一样
			if(this == &temp)
				return *this;
			std::memcpy(head,temp.head,get_pos(size()) + 1);
			return *this;
		}
		~bitset()
		{
			delete [] head;
		}
	public:
		const_reference operator [] (size_type pos) const 
		{
			assert(pos < size());
	        return reference(head,pos);
		}
	
		reference operator [] (size_type pos)
		{
			assert(pos < size());
			return reference(head,pos);
		}

		size_type size() const 
		{
			return SIZE;
		}

		size_type count() const 
		{
			size_type m_count = 0;
			for(size_type i = 0; i < size(); ++i)
			{
			size_type cur_pos = get_pos(i);
			size_type cur_sub = get_sub(i);
			if(read(&head[cur_pos],cur_sub))
				++m_count;
			}
			return m_count;
		}

       self& set()
	   {
		   std::memset(head,0xFF,get_pos(size()) + 1);
		   // 将剩余的位清零
		   zero_last();
		   return *this;
	   }
       self& set(size_type pos, bool val = true)
	   {
		   assert(pos < size());
		   size_type cur_pos = get_pos(pos);
		   size_type cur_sub = get_sub(pos);
		   set(&head[cur_pos],cur_sub,val);
		   return *this;
	   }

	   bool any() const 
	   {
	  for(size_type i = 0; i <= get_pos(size()); ++i)
		  if(head[i])
			  return true;
	  return false;
	   }
	   bool none() const 
	   {
		   for(size_type i = 0; i <= get_pos(size()); ++i)
			   if(head[i])
				   return false;
		   return true;
	   }
	   self& reset()
	   {
		 std::memset(head,0,get_pos(SIZE) + 1);
		 return *this;
	   }
	   self& reset(size_type pos)
	   {
		   assert(pos < size());
		   size_type cur_pos = get_pos(pos);
		   size_type cur_sub = get_sub(pos);
		   set(&head[cur_pos],cur_sub,false);
		   return *this;
	   }
	   bool test(size_t pos) const
	   {
		   assert(pos < size());
           size_type cur_pos = get_pos(pos);
		   size_type cur_sub = get_sub(pos);
		   return read(&head[cur_pos],cur_sub);
	   }

	   self& flip()
	   {
		   size_type pos = get_pos(size());
		   for(size_type i = 0; i <= pos; ++i)
			   head[i] = ~head[i];
		   zero_last();
		   return *this;
	   }
	   self& filp(size_type pos)
	   {
		   assert(pos < size());
		   if(test(pos))
			   set(pos,false);
		   else
			   set(pos,true);
		   return *this;
	   }
	   std::string to_string() const 
	   {
		   std::string str(size(),'0');   // 自动增长效率低,所以直接初始化
		   for(size_type i = size(),j = 0; i >= 1; )
			   if(test(--i))
				   str[j++] = '1';
			   else
				   ++j; // 不做无用功,直接跳过,不用复制了
		   return str;
	   }
	   ULONG to_ulong() const 
	   { 
		   size_type num_count = get_num_count();
		   assert(num_count <= sizeof(ULONG) * 8);
#ifdef NDEBUG
		   if(num_count > sizeof(ULONG) * 8) 
			   throw std::overflow_error("overflow error,please check it");
#endif
		   if(size() == sizeof(ULONG) * 8 || num_count == sizeof(ULONG) * 8)
		       return *(ULONG*)head;
		   ULONG tmp_val = 0;
		   for(size_type i = 0; i < num_count; ++i)
			   set(&tmp_val,i,test(i));
		   return tmp_val;
	   }
	   ULLONG to_ullong() const   // c++11 功能
	   {
		   size_type num_count = get_num_count();
		   assert(num_count <= sizeof(ULLONG) * 8);
#ifdef NDEBUG
		     if(num_count > sizeof(ULLONG) * 8) 
			   throw std::overflow_error("overflow error,please check it");
#endif
		   if(size() == sizeof(ULLONG)* 8 || num_count == sizeof(ULLONG) * 8)
		       return *(ULLONG*)head;
		   if(num_count <= sizeof(ULONG) * 8) 
			   return to_ulong();
		   ULLONG tmp_val = 0;
		   for(size_type i = 0; i < num_count; ++i)
			   set(&tmp_val,i,test(i));
		   return tmp_val;
	   }
	   //下面是一些位操作符的重载
	   self& operator &= (const self& obj)
	   {
		  size_type position = get_pos(size());
		  for(size_type i = 0; i <= position ; ++i)
			  head[i] &= obj.head[i];
		  return *this;
	   }
	   self& operator |= (const self& obj)
	   {
		  size_type position = get_pos(size());
		  for(size_type i = 0; i <= position; ++i)
			  head[i] |= obj.head[i];
		  return *this;
	   }
	   self& operator ^= (const self& obj)
	   {
		  size_type position = get_pos(size());
		  for(size_type i = 0; i <= position; ++i)
			  head[i] ^= obj.head[i];
		  return *this;
	   }
	   self operator | (const self& obj) const 
	   {
		   self temp(*this);
		   temp |= obj;
		   return temp;
	   }
	   self operator & (const self& obj) const 
	   {
		   self temp(*this);
		   temp &= obj;
		   return temp;
	   }
	   self operator ^ (const self& obj) const
	   {
		   self temp(*this);
		   temp ^= obj;
		   return temp;
	   }
	   self operator ~ () const 
	   {
		   self temp(*this);
		   temp.flip();
		   return temp;
	   }
	   self& operator <<= (size_type n)
	   {
		   if(n == 0)
			   return *this;
		   if(n >= size())
			  std::memset(head,0,get_pos(size()) + 1);
		   //相对向右复制覆盖
		   else
		   {
		   copy_right(size(),0,size()-n);  
		   fill(0,n,false); // 空出的位置填充0
		   }
		   return *this;
	   }
	  self& operator >>= (size_type n)
	   {
		   if(n == 0) 
			   return *this;
		   if(n >= size())
			   std::memset(head,0,get_pos(size()) + 1);
		   else
		   {
		   copy_left(0,n,size());
		   fill(size()-n,size(),false);
		   }
		   return *this;
	   }
	  self operator << (size_type n) const 
	  {
		  self temp(*this);
		  temp <<= n;  // 转调operator <<= 
		  return temp;
	  }
	  self operator >> (size_type n) const 
	  {
		  self temp(*this);
		  temp >>= n;
		  return temp;
	  }
	  bool operator == (const self& obj) const 
	  {
		  size_type pos = get_pos(size());
		  for(size_type i = 0; i <= pos; ++i)
			  if(head[i] != obj.head[i])
				  return false;
		  return true;
	  }
	  bool operator != (const self& obj) const 
	  {
		  return !(*this == obj);
	  }
	   friend std::ostream& operator << (std::ostream& os,const self& obj)
	   {
		   for(size_type i = obj.size(); i >0; )
			   os<<obj.test(--i);
		   return os;
	   }
	};

} // end of namespace mystd 
#endif //__cplusplus
#endif //MYSTD_BITSET_TEST_H



下面是一个小测试程序,并与标准库的运行结果进行比对!看代码!

#include<iostream>
#include<fstream>
#include<bitset> // 标准库
#include"bitset.h"  // mystd::bitset
#define STD mystd   // 改为mystd运行自己写的bitset版本


using std::cout;
using std::endl;

int main()
{  // 为了方便和标准库比对,将结果写入文件,test.txt在当前目录
	std::fstream out("test.txt",std::ios_base::out | std::ios_base::app);
	if(!out)
	{
		std::cerr<<"文件打开失败!"<<endl;
		exit(1);
	}
	out<<"********************mystd::bitset执行结果!********************"<<endl;
	const int mn =64;
	STD::bitset<mn> test_1;  
	STD::bitset<mn> super_test(test_1);  // 验证复制构造函数
	//下面的代码随便写了,主要测试和标准库的结果是否一致
	test_1.set(20);
	test_1[50] = 1;
	out<<(test_1 ^ super_test)<<endl;
	out<<(test_1 & super_test)<<endl;
	out<<(test_1 | super_test)<<endl;
	super_test.set(10);
	super_test.set(50,0);
	super_test.reset();
	super_test.flip();
	super_test[60] = 1;
	super_test[20] = 0;
	out<<super_test<<endl;
	out<<super_test.to_string()<<endl;
	super_test[49] = 1;
	out<<super_test.to_ullong()<<endl;
	super_test[63] = 1;
	//out<<super_test.to_ulong()<<endl;
	if(super_test.any())
		out<<"存在一个bit为1"<<endl;
	if(super_test.none())
		out<<"不存在一个bit为1"<<endl;
	super_test.reset();
	if(super_test.none())
		out<<"不存在一个bit为1"<<endl;
	super_test[50] = 1;
	super_test[36] = 1;
	super_test <<= 20;
	super_test >>= 5;
	test_1 = super_test;
	if(test_1 == super_test)
		out<<"相等"<<endl;
	else
		out<<"不等"<<endl;

	out<<STD::bitset<100>("1100011")<<endl;
	out<<(STD::bitset<53>(102545) << 20)<<endl;
	system("pause");
	return 0;
}

最终的运行结果,截图



为了方便和标准库进行比对,将于运行结果写入文件test.txt

将上面代码的宏定义改一下,改为#define STD std 运行标准库版本,

看运行结果。

可以看到,运行结果完全一样。

如果大家有发现bug,希望不吝赐教!

谢谢! 本文原创,转载的注明一下出处,谢谢!




C++: 模拟实现类bitset C++: 模拟实现类bitset标签: C++ bitset 位运算by 小威威1.bitset简介bitset能实现对数字的位的操作,同时也能通过类似于数组的下标来访问各个位的数值,以执行相应的操作。模拟bitset就是用一个普通的数组来存储数据以达到模拟的目的。先声明一下,本篇文章并不是讲述标准库中bitset这个类的用法,而是去讲述如何实现一个模拟bitset的类。众所周知,int类型在64 阅读详情

相关推荐

从SolidWorks到URDF:插件使用、关节配置与PyBullet仿真避坑指南

本文提供了一份从SolidWorks导出URDF模型并导入PyBullet进行仿真的完整实战指南。详细讲解了SolidWorks插件的正确安装与配置、关节类型的选择与坐标系对齐的核心技巧,并针对PyBullet仿真中常见的模型散架、路径错误、物理属性异常等问题提供了深度避坑解决方案,帮助机器人开发者高效完成从设计到仿真的全流程。

weixin_29081101的博客 542

c++手写的bitset

支持stl bitset 类似的api。

qq_34179431的博客 698

Rockit VDEC解码实战:从零构建高效视频处理流水线

本文详细介绍了Rockit VDEC硬件解码模块在RK3568/RK3588平台的应用实践,涵盖开发环境配置、MPI接口使用、码流发送模式选择、内存管理优化及多路解码系统构建。通过实战案例展示如何利用VDEC实现高效视频处理流水线,显著降低CPU占用率,提升嵌入式多媒体开发效率。

ol789012的博客 304

神奇的二进制(bitset部分操作解释)

(在计算机中,数都是二进制来存储的,所以二进制的一些运算要比普通的等价运算(+,-,*,/)更快,更简单,所以知道他们的技巧显得尤其重要!)异或运算:首先 异或(^) 表示当两个数的二进制表示,进行异或运算时,当前位的两个二进制表示不同则为 1 相同则为 0 .该方法被广泛推广用来统计一个数的1的位数!所以二进制中 对应二进制位数进行异或操作时, 与0异或对应该二进制位数值不变, 与 1 异或

Anxdada -- 我等风来也等你 2240

Apollo control模块横向控制原理及核心代码逐行解析

看完这篇文章,你会对apollo横向控制有一个整体的概念

weixin_39199083的博客 2万+

人形机器人构成及成本估算(附报告)

这些执行器本身由螺杆、减速器、电机、传感器、滚珠轴承和编码器等组件构成。实现线性与旋转运动互转。人形机器人的运动系统可以由电驱动、液压驱动或气动驱动组成,但由于电驱动具有更高的精度和更快的响应速度,正在成为主流设计方案。执行器:NSK、THK、Harmonic Drive、Leaderdrive、Nidec、Moons。由螺杆、减速器、电机、传感器、轴承和编码器组成(如上为Tesla Optimus执行器设计示意)。传感器:Keyence、Robosense、Sensata、ATI、TE、Sony。

具身机器人和通用AI 1771

扶苏的bitset浅谈

bitset作为C++一个非常好用的STL,在一些题目中巧妙地使用会产生非常不错的效果。今天扶苏来分享一点bitset的基础语法和应用 本文同步发布于个人其他博客,同时作为P3674题解发布。 本文感谢@burnside和@ddosvoid神仙帮助审稿。 注意:以下内容均按照C++98语法书写,可以在C++98下编译通过。 bitset是一个01串,每一位是占一个字节,可以进行单点0/1修改,左移...

weixin_34351321的博客 811

Python爬虫实战:模拟登录知乎 – 通过加密参数和验证码实现自动登录

通过本篇博客的讲解,我们学习了如何通过 POST请求 和 验证码识别,模拟登录知乎并爬取用户信息、问题数据。随着爬虫技术的发展,面对更复杂的反爬虫机制,我们可以不断调整策略,以绕过这些防护,实现数据的自动化抓取。

2201_76125261的博客 731

hdu6085 手写bitset

#include #include #include #include #include using namespace std; typedef unsigned long long ull; const int maxn=50005; struct Bitset { ull bit[1565];//开两倍的空间,50000/64*2 void reset() {

fanbaobao829的博客 601

YOLOv11低照度目标检测优化方案:基于SCINet可训练预处理主干的全流程实现指南

创建一个新的Python文件,如。

FJN110的博客 187

读懂 403 Forbidden, the request has been blocked by UCON.:它不是浏览器渲染问题,而是后端安全闸门在拦截

摘要 403 Forbidden 错误表明服务器理解请求但拒绝执行,通常与权限或访问控制有关。当错误信息显示 "blocked by UCON" 时,说明请求被 SAP 体系中的统一连接管控框架拦截。UCON 采用白名单机制限制外部调用,通过记录、评估、强制三阶段流程实施管控。常见触发场景包括 HTTP 服务与通信场景配置不一致、白名单未更新等。排查时应通过 DevTools 确认服务器响应,使用 curl 排除浏览器干扰,并比较不同环境的行为差异。解决方案通常涉及调整配置传输顺序或更新

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 239

C++——bitset

bitset——简单又方便的位运算工具

JAN6055的博客 1万+

RK3568平台(平台总线篇)Gsensor STK8BA50

Gsensor,即加速度传感器(Accelerometer),是一种用于测量物体加速度的电子设备。以下是其关键点:1.工作原理MEMS技术:大多数Gsensor基于微机电系统(MEMS),通过检测质量块的位移来测量加速度。压电效应:部分Gsensor利用压电材料在受力时产生电压的特性来测量加速度。2.主要功能加速度测量:测量物体在X、Y、Z三个方向上的加速度。倾斜检测:通过重力加速度判断设备的倾斜角度。运动检测:识别设备的运动状态,如静止、移动、晃动等。震动检测:感知设备的震动或冲击。

weixin_49303682的博客 479

c++ bitset 基本用法

bitset存储二进制数位。 bitset就像一个bool类型的数组一样,但是有空间优化——bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一。 bitset中的每个元素都能单独被访问,例如对于一个叫做foo的bitset,表达式foo[3]访问了它的第4个元素,就像数组一样。 bitset有一个特性:整数类型和布尔数组都能转化成bitset。 bitset的大小...

风知我意否的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c++ <bitset> bitset函数

1. bitset 函数

JIAN_ZANG1125的博客 3193

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++ <bitset>

bitset>是一个强大的工具,用于处理位操作,特别是在需要高效地管理和操作布尔值的场合。它的各种操作函数使得位操作变得简单直观。理解和掌握bitset可以提升代码的效率和可读性,尤其是在涉及大量布尔值的程序中。

qq_50373827的博客 1668

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ bitset 用法

C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset<4> bitset1;  //无参构造,长度为4,默认每一位为0 bitset<8> bitset2(12);  //长度为8,二进制保存,前面用0补充 string s = "100101"; bitset<10> bitset3(s);  //长度为10,前面

山河 1648

C++基础之bitset

类模板std::bitset template <size_t N> class bitset; 头文件 #include <bitset> 说明 一个bitset中保存了一些bit(字节, 只能取两个值的元素:0或1,真或假 …) bitset模拟了一个bool类型的数组,但是优化了内存空间:总的来说,每个元素值占用一个bit(比大多数系统中最小的元素char小了8倍) 每个位置的都可以独立的访问:例如,给定一个bitset命名为foo,foo[3]访问的就是第四个元素,就像通常数

itlilyer的博客 4499

C++ STL bitset 位图

C++ bitset是一个高效处理固定大小位序列的STL容器类。它通过#include<bitset>引入,编译时确定位数,每位仅占1bit内存空间。支持整数、字符串等多种初始化方式,提供set()、reset()、flip()等位操作方法,以及各种位运算和类型转换功能。典型应用包括权限管理、质数筛选和状态标志系统。相比vector<bool>,bitset内存效率更高但大小固定。使用时需注意越界访问问题,[]运算符不检查边界而test()方法会抛出异常。bitset特别适合需要高性

似流水般平静而坚定。 888

C++ bitset(位图)的模拟实现

判断方式比较简单,每一个整数的所有比特位,只要有一个为1,那该整数就肯定不等于0,所以,我们可以遍历所有整数,只要有一个整数不等于0,那就说明有1,返回true,否则所有整数都是0,没一个1,返回false。需要注意的是,如果位图没有包含最后一个整数的全部比特位,那么最后一个整数的二进制无论如何都不会为全1,所以在判断最后一个整数时应该只判断位图所包含的比特位。例如,假如我们要建立一个50个比特位的位图,就需要两个int大小,共64个比特位,使用前50个比特位,后14个舍弃不用就好。的大小是否符合预期。

m0_74189279的博客 1129

C++ BitSet

还是温习C++ 位操作符 操作符 功能 用法 ~ 按位非 ~expr << 左移 expr1 << expr2 >> 右移 expr1 >> expr2 & 按位与 expr1 & expr2 ^ 按位异或 expr1 ^ expr2 | 按位或 expr1 | expr2 &= 按位与赋值 expr1 &= expr2 ^= 按位异或赋值 expr1 ^= expr2 |= 按位

Jave.Lin 的学习笔记 380

C++ bitset用法

背景 C++中经常涉及到位运算,例如左移、右移、位与、位或、异或运算等。可能涉及到二进制转化的原因,位运算是让很多C++入门者头疼的一个篇章,即使C++有内置的运算符直接支持以上算法。但是bitset的出现让位运算更透明、更清晰、更简单,它让我们能够以数组的形式去操作一个数的二进制。 我接触到它是因为在一个项目中涉及到数据编解码操作。为了节省内存空间,一些枚举值在编码阶段用位来存储(通信行业和地图...

热爱技术,热爱生活 1274

C++STL系列之bitset

第一次提到bitset应该是在第一次算法博客上提到,它可以完美的代替bool a[N],bitset到底是什么,我们下面来讲解一下bitset称为位图,bit–比特位,set集合,位图,就是每一位存放一种状态,通常判断某个数据在不在,使用于数据量大,无重复,只关注在不在的数据的情况。当然库里是有bitset的bitset这里放的是位数,比如有bitset<1000 > bt,就是存放1000bit位,想表示10存在,就把10搞成1。布隆过滤器了解,bitset的使用要清楚。

weixin_62188419的博客 1112

bitset详解c++

basis bitset 的构造 bitset的操作 一些高级用法 将Bitsets视为一组标志 一些简单的原子操作,往往能组合出复杂而强大的功能。位操作的深远意义不在于表示一种数值,而是可能的情况数。我虽然暂时不知道bitset能组合出如何复杂的功能,但冥冥之中却有这样的直觉感受。 basis bitset所在的头文件<bitset> 命名空间std bits...

CSer 1万+

C++ bitset

C++ 中的 std::bitset 是一个固定大小的二进制位集合,每个元素只能是 0 或 1。它的大小在编译时就已经确定,可以在定义时指定大小,也可以使用默认构造函数创建一个空的 bitset,然后通过 resize() 方法重新指定大小。bitset 同时支持位运算和逻辑运算,并提供了许多实用的方法。std::bitset 作为二进制位集合,可以用于许多场景,如压缩数据、位图存储等。在实际编程中,应充分利用 std::bitset 的特性,提高代码效率和可读性。

奇妙方程式的博客 1215

C++ bitset类的使用

本文主要内容: 1. bitset类的函数使用 2. 自己实现的myBitset类

weixin_43246859的博客 1078
下一篇: Microsoft Macro
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值