[namespace hdk] 64位 bitset
功能
已重载运算符
[](int) (右值,修改请使用 set() 方法)
~()
+(bitset)
+(unsigned long long)
+=(bitset)
+=(unsigned long long)
> == < >= <= != (bitset\unsigned long long)
=(bitset\unsigned long long\string)
<< >>
max()
min()
已定义函数
int size() 返回 bitset 大小
int array_size() 返回 bitset 占用的 unsigned_longlong 变量个数
void clear()
unsigned long long &at(int pos) 返回 pos 位置的存放数组(对应下标 $[64pos,64pos+63]$)
void upset_down(int pos) 将 pos 位置的数字翻转
void upset_down(int l,int r) 将区间数字翻转
void set(unsigned long long x) 或 operator =(unsigned long long x) 设置 bitset 的值为 x
operator =(string x) 设置 bitset 的值为 x
void set(int pos,bool value) 设置 pos 处的值为 value
void set(int l,int r,bool value) 设置 $[l,r]$ 内的值为 value
print() print(bool iscomplete_print):当 iscomplete_print=true 时删除前导零;print(char devide=0,char end='\n',bool iscomplete_print=false) 用 devide 做输出分隔符,end 做结束符输出
flip() 整体翻转
all() 全为 1 时返回 true
any() 有至少一个 1 时返回 true
none() 没有 1 时返回 true
count() 返回 1 的个数
string to_string() 转为字符串返回
to_string(bool complete_print=false) 当 iscomplete_print=true 时删除前导零
函数复杂度
此 bitset 为 64 位/8byte,是 stl 空间效率的四倍
此 bitset 采用分块思想实现,效率中等.
[]
\(O(1)\)
~()
\(T(\frac{size}{64})+\Theta(0,127)\)
+(bitset)
\(O(size)\)
+(unsigned long long)
\(O(size)\)
+= > == < >= <= !=
\(\Theta(1,size)\)
=
\(O(size)\)
<< >>
\(O(size)\)
max() min()
\(\Theta(1,size)\)
size()
\(O(1)\)
array_size()
\(O(1)\)
clear()
\(T(\frac{size}{64})\)
&at()
\(O(1)\)
upset_down(int)
\(O(1)\)
upsetdown(int,int)
\(T(\frac{r-l+1}{64})+\Theta(0,127)\)
set(unsigned long long)
\(\Theta(0,64)\)
set(int,bool)
\(O(1)\)
set(int,int,bool)
\(T(\frac{r-l+1}{64})+\Theta(0,127)\)
print()
\(O(size)\)
flip()
\(T(\frac{size}{64})+\Theta(0,127)\)
any()
\(O(size)\)
all()
\(O(size)\)
none()
\(O(size)\)
count()
\(O(size)\)
to_string()
\(O(size)\)
代码
#include<bits/stdc++.h>
using namespace std;
namespace hdk{
unsigned long long maxull=(1ull<<63)-1+(1ull<<63);
template<int siz>
class bitset{
private:
unsigned long long s[int(ceil(siz/64.0))]={};
public:
inline int size(){
return siz;
}
inline int array_size(){
return int(ceil(siz/64.0));
}
inline void clear(){
for(int i=0;i<=array_size()-1;++i){
s[i]=0;
}
}
bool operator [](int x){
int pos=x/64;
return ((s[pos]>>(x%64))&1);
}
inline unsigned long long &at(int pos){
return s[pos];
}
inline void upset_down(int pos){
int x=pos/64;
s[x]^=(1ull<<(pos%64));
}
inline void upset_down(int l,int r){
int pos1=l/64,pos2=r/64;
if(pos1==pos2){
for(int i=l;i<=r;++i){
upset_down(i);
}
return;
}
for(int i=pos1+1;i<=pos2-1;++i){
if(s[i]==0){
s[i]=maxull;
}
else if(s[i]==maxull){
s[i]=0;
}
else{
for(int j=i*64;j<=(i+1)*64-1;++j){
upset_down(j);
}
}
}
for(int i=l;i<=(pos1+1)*64-1;++i){
upset_down(i);
}
for(int i=pos2*64;i<=r;++i){
upset_down(i);
}
}
inline void set(unsigned long long x){
*this=x;
}
inline void set(int pos,bool value){
if((*this)[pos]!=value){
this->upset_down(pos);
}
}
inline void set(int l,int r,bool value){
int pos1=l/64,pos2=r/64;
if(pos1==pos2){
for(int i=l;i<=r;++i){
set(i,value);
}
return;
}
if(value){
for(int i=pos1+1;i<=pos2-1;++i){
s[i]=maxull;
}
}
else{
for(int i=pos1+1;i<=pos2-1;++i){
s[i]&=0;
}
}
for(int i=l;i<=(pos1+1)*64-1;++i){
set(i,value);
}
for(int i=pos2*64;i<=r;++i){
set(i,value);
}
}
hdk::bitset<siz> operator ~(){
hdk::bitset<siz>ans;
ans=*this;
ans.upset_down(0,siz-1);
return ans;
}
void operator =(unsigned long long x){
s[0]=x;
}
void operator =(string x){
for(int i=(int)x.length()-1;i>=0;--i){
this->set(x.length()-1-i,x[i]-'0');
}
}
hdk::bitset<siz> operator +(hdk::bitset<siz>A){
hdk::bitset<siz>ans;
int x=0;
for(int i=0;i<=siz-1;++i){
x+=(*this)[i]+A[i];
ans.set(i,x&1);
x>>=1;
}
return ans;
}
void operator +=(hdk::bitset<siz>A){
*this=*this+A;
}
void print(bool iscomplete_print){
bool iszero=iscomplete_print;
for(int i=siz;i>=0;--i){
bool res=(*this)[i];
if(res==1){
iszero=true;
}
if(iszero){
putchar(res+'0');
}
}
if(!iszero) putchar('0');
putchar('\n');
}
void print(char devide=0,char end='\n',bool iscomplete_print=false){
bool iszero=iscomplete_print;
for(int i=siz;i>=0;--i){
bool res=(*this)[i];
if(res==1){
iszero=true;
}
if(iszero){
putchar(res+'0');
if(devide!=0) putchar(devide);
}
}
if(!iszero) putchar('0');
if(end!=0) putchar(end);
}
hdk::bitset<siz> operator &(hdk::bitset<siz>A){
hdk::bitset<siz> ans;
for(int i=0;i<=siz-1;++i){
ans.set(i,(*this)[i]&A[i]);
}
return ans;
}
hdk::bitset<siz> operator &(unsigned long long x){
hdk::bitset<siz> A,ans;A.set(x);
for(int i=0;i<=siz-1;++i){
ans.set(i,(*this)[i]&A[i]);
}
return ans;
}
void operator &=(hdk::bitset<siz>A){
*this=*this&A;
}
void operator &=(unsigned long long x){
*this=*this&x;
}
hdk::bitset<siz> operator |(hdk::bitset<siz>A){
hdk::bitset<siz> ans;
for(int i=0;i<=siz-1;++i){
ans.set(i,(*this)[i]|A[i]);
}
return ans;
}
hdk::bitset<siz> operator |(unsigned long long x){
hdk::bitset<siz> A,ans;A.set(x);
for(int i=0;i<=siz-1;++i){
ans.set(i,(*this)[i]|A[i]);
}
return ans;
}
void operator |=(hdk::bitset<siz>A){
*this=*this|A;
}
void operator |=(unsigned long long x){
*this=*this|x;
}
hdk::bitset<siz> operator ^(hdk::bitset<siz>A){
hdk::bitset<siz> ans;
for(int i=0;i<=siz-1;++i){
ans.set(i,(*this)[i]^A[i]);
}
return ans;
}
hdk::bitset<siz> operator ^(unsigned long long x){
hdk::bitset<siz> A,ans;A.set(x);
for(int i=0;i<=siz-1;++i){
ans.set(i,(*this)[i]^A[i]);
}
return ans;
}
void operator ^=(hdk::bitset<siz>A){
*this=*this^A;
}
void operator ^=(unsigned long long x){
*this=*this^x;
}
inline bool empty(){
bool x=0;
for(int i=0;i<=array_size()-1;++i){
x+=s[i];
}
return !x;
}
bool operator !(){
return !empty();
}
inline unsigned long long it(){
return s[0];
}
inline void set(){
for(int i=0;i<=array_size()-1;++i){
s[i]=maxull;
}
}
inline void reset(){
clear();
}
inline int count(){
int ans=0;
for(int i=0;i<=siz-1;++i){
if((*this)[i]==1) ans++;
}
return ans;
}
bool operator <(hdk::bitset<siz> A){
for(int i=array_size()-1;i>=0;--i){
if(s[i]!=A.s[i]){
return s[i]<A.s[i];
}
}
return false;
}
bool operator <(unsigned long long x){
hdk::bitset<siz>A;A=x;
for(int i=array_size()-1;i>=0;--i){
if(s[i]!=A.s[i]){
return s[i]<A.s[i];
}
}
return false;
}
bool operator ==(hdk::bitset<siz> A){
for(int i=array_size()-1;i>=0;--i){
if(s[i]!=A.s[i]){
return false;
}
}
return true;
}
bool operator ==(unsigned long long x){
hdk::bitset<siz>A;A=x;
for(int i=array_size()-1;i>=0;--i){
if(s[i]!=A.s[i]){
return false;
}
}
return true;
}
inline bool test(int pos){
return (*this)[pos];
}
inline string to_string(bool complete_print=false){
string ans;
if(complete_print){
for(int i=siz-1;i>=0;--i){
ans.push_back((*this)[i]+'0');
}
return ans;
}
else{
bool iszero=false;
for(int i=siz-1;i>=0;--i){
bool res=(*this)[i];
if(res==1) iszero=true;
if(iszero) ans.push_back(res+'0');
}
if(!iszero) ans.push_back('0');
return ans;
}
}
bool operator !=(hdk::bitset<siz> A){
return !(*this==A);
}
bool operator !=(unsigned long long x){
return !(*this==x);
}
bool operator >(hdk::bitset<siz> A){
return !(*this<A or *this==A);
}
bool operator >(unsigned long long x){
return !(*this<x or *this==x);
}
bool operator >=(hdk::bitset<siz> A){
return (*this>A or *this==A);
}
bool operator >=(unsigned long long x){
return (*this>x or *this==x);
}
bool operator <=(hdk::bitset<siz> A){
return (*this<A or *this==A);
}
bool operator <=(unsigned long long x){
return (*this<x or *this==x);
}
inline bool all(){
for(int i=0;i<=siz-1;++i){
if((*this)[i]==0) return false;
}
return true;
}
inline bool any(){
for(int i=0;i<=siz-1;++i){
if((*this)[i]==1) return true;
}
return false;
}
inline bool none(){
return !any();
}
inline void flip(){
*this=~*this;
}
friend ostream& operator<<(ostream& output,hdk::bitset<siz> inx){
inx.print(0,0);
return output;
}
friend istream& operator>>(istream& input,hdk::bitset<siz> inx){
unsigned long long x;
input>>x;inx=x;
return input;
}
friend hdk::bitset<siz> max(hdk::bitset<siz>A,hdk::bitset<siz>B){
if(A>B) return A;
else return B;
}
friend hdk::bitset<siz> min(hdk::bitset<siz>A,hdk::bitset<siz>B){
if(A<B) return A;
else return B;
}
hdk::bitset<siz> operator <<(int x){
hdk::bitset<siz> ans;
for(int i=siz-1;i>=x;--i){
ans.set(i,(*this)[i-x]);
}
return ans;
}
hdk::bitset<siz> operator >>(int x){
hdk::bitset<siz> ans;
for(int i=siz-1-x;i>=0;--i){
ans.set(i,(*this)[i+x]);
}
return ans;
}
};
}
using namespace hdk;
int main(){
hdk::bitset<80>a,b,c;
a="11010101011101010";
a.print(true);
a=a>>2;
a.print(true);
}
[namespace hdk] 64位 bitset的更多相关文章
- C#通过WinAPI获取内存信息,32位64位可用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runti ...
- WIN10 64位下VS2015 MFC直接添加 halcon 12的CPP文件实现视觉检测
近段时间开始接触halcon,但是在VS2015里面使用,无论是配置还是生产EXE文件,都不如意. 加上网上的教程很多,经过多次测试,其实有很多地方无需修改,如果修改的太多也失去了直接添加封装的意义. ...
- windows 64位整数
#include <iostream> #include <ctime> using namespace std; int main() { cout << cou ...
- 三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
第一题 C++标准中,虚表指针在类的内存结构位置没有规定,不同编译器的实现可能是不一样的.请实现一段代码,判断当前编译器把虚表指针放在类的内存结构的最前面还是最后面. 第二题 在游戏中所有物品的实例 ...
- C# 第三方DLL,可以实现PDF转图片,支持32位系统、64位系统
itextsharp.dll,是一个开源的在C#中用来生成PDF文档的库文件,不少C#爱好者用它制作出了PDF文档生成器.使用时只需在你的C#项目中添加引入此组件即可,使用方法网上有很多,自己查阅一下 ...
- [转]oracle odp.net 32位/64位版本的问题
本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...
- 【转】Win7下VS2010中配置Opencv2.4.4的方法(32位和64位都有效)(亲测成功)
在vs2010下配置opencv是件痛苦的事情,一点点错误可能就会导致莫名其妙的报错,各种error让人郁闷不已,这里提供给大家一篇vs2010下配置opencv2.4.4的方法,我是64位的win7 ...
- C# 32位程序访问64位系统注册表
原文:C# 32位程序访问64位系统注册表 我的上一篇文章已经阐述了“32位程序和64位程序在64位平台上读\写注册表的区别”,那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注 ...
- 第一篇:CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )
前言 本文讲解如何在VS 2010开发平台中搭建CUDA开发环境. 当前配置: 系统:WIN7 64位 开发平台:VS 2010 显卡:英伟达G卡 CUDA版本:6.0 若配置不同,请谨慎参考本文. ...
- (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功
(win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功 1.下载opencv 官网http://opencv.org/下载windows版Op ...
随机推荐
- 第三节 JMeter安装及配置
1.官网地址下载 (1)JDK:https://www.oracle.com/cn/java/technologies/downloads/,下载1.8版本以上的,最好下载最新版本(本次下载本次下载了 ...
- MiniAuth 一个轻量 ASP.NET Core Identity Web 后台管理中间插件
MiniAuth 一个轻量 ASP.NET Core Identity Web 后台管理中间插件 「一行代码」为「新.旧项目」 添加 Identity 系统跟用户.权限管理网页后台系统 开箱即用,避免 ...
- 【js】 reduce、filter、map 数组链式调用求加和
let data = [ {hierarchy: '香蕉', count: 1}, {hierarchy: '苹果', count: 2}, {hierarchy: '葡萄', count: 3}, ...
- 云计算:Docker-compose快速部署前后端项目
| 更好的观看效果请前往,原文博客地址:https://www.zeker.top/posts/338829e1/ 介绍 Docker Compose 是官方编排的项目之一,负责快速的部署分布式应用. ...
- 【VMware VCF】VMware Cloud Foundation Part 06:部署 VI 工作负载域。
VMware Cloud Foundation 标准架构中,管理域和 VI 工作负载域需要分开部署,管理域是初始构建(Bring-up)中部署的一个工作负载域并且只有一个,管理域专门用于承载管理相关组 ...
- 【Zookeeper】Win平台伪集群搭建
下载稳定版Zookeeper https://downloads.apache.org/zookeeper/stable/ GZ包: apache-zookeeper-3.6.3-bin.tar.gz ...
- 【DataBase】MySQL 07 SQL函数 单行函数其一 字符函数
SQL函数的概念 -- SQL函数 -- 概念:类似Java的方法,将已经定义好的不再改变的逻辑语句封装在函数体内,对外提供方法的标识 -- 隐藏了实现细节,提高功能的可重用 -- SELECT 函数 ...
- AI生成的图片是否具有版权:如何认定美术作品的“抄袭”行为?
相关: 实务丨如何认定美术作品的"抄袭"行为? 首先,我认为AI生成的图片是否具有版权这个问题就不是一个问题,或者说这不是一个正确的提法,应该说AI生成的某张图片是否具有版权?也可 ...
- 【转载】 Visual Studio Code几款FTP插件使用总结
===================================================== 平时要维护类似wordpress这样的网站,然后虚拟主机又不支持远程仓的版本管理.总而言之, ...
- Linux的netns使用总结
转载请注明出处: Linux的netns(Network Namespace)是Linux内核提供的一项强大的网络隔离功能,它能够创建多个独立的网络空间,每个空间都拥有自己独立的网络协议栈,包括网络接 ...