#如果!定义的HAVE_BITARRAY_H__#定义HAVE_BITARRAY_H__//此文件是FXT库的一部分。//版权所有(C)2010、2011、2012、2014、2018、2019、2023 Joerg Arndt//许可证:GNU通用公共许可证第3版或更高版本,//请参阅主目录中的文件COPYING.txt。#包括“bits/bitcount.h”#包括“bits/bitasm.h”#包括“bits/bitsperlong.h”#包括“fxttypes.h”//出于计时或测试目的,禁止汇编指令://#取消BITS_USE_ASM//#定义BITARRAY_ASSERTS//#如果定义了BITARRAY_ASSERTS#包括“jjassert.h”#结束语#如果!定义的BITS_USE_ASM#定义DIVMOD(n,d,bm)\ulong d=n/BITS_PER_LONG\ulong bm=1UL<<(n%BITS_PER_LONG);#定义DIVMOD_TEST(n,d,bm)\ulong d=n/BITS_PER_LONG\ulong bm=1UL<<(n%BITS_PER_LONG)\ulong t=bm&f[d];#endif//ifndef BITS_USE_ASM类位数组//位数组类主要用作布尔值的内存节省数组。//有效索引为0…nb_-1(在C数组中通常如此)。{公众:ulong*f;//钻头铲斗ulong n;//位数ulong nfw_;//所有比特都被使用的字数可以为零ulong mp_;//部分使用单词的掩码(如果有),否则为零//(一个位于所用位的位置)布尔myfq;//f[]是否按类分配静态bool use_asm_q(){#如果定义了BITS_USE_ASM返回true;#其他返回false;#endif//BITS_USE_ASM}位数组(const bitrarray&)=删除;bitarray&运算符=(const bitarray&)=删除;私人:ulong ctor核心(ulong nbits){n=nb位;//nw:字数(包括部分使用的字数),nw>=1ulong nw=n_/BITS_PER_LONG;//字数//nbl:最后一个(部分使用的)字中使用的位数,如果mw==mfw,则为0ulong nbl=n_-nw*BITS_PER_LONG;//最后一个字中使用的位数nfw_=nw;//完全使用的单词数mp_=0UL;如果(0!=nbl)//有部分使用的单词{++西北;//增加总字数//最后一个(部分使用的)单词的掩码:mp_=~0UL;mp_>>=(位_ PER_LONG-nbl);}返回nw;}公众:显式位数组(ulong nbits,ulong*f=nullptr)//nbit必须为非零{ulong nw=系数核(nbits);如果(f!=空ptr){f=f;myfq_=假;}其他的{f=新ulong[nw];myfq_=真;}}~比特数组(){如果(myfq)删除[]f;}ulong size()常量{return n;}ulong试验(ulong n)常数//测试是否设置了第n位。{#如果定义了BITARRAY_ASSERTS贾塞尔特(n<n);#结束语#如果定义了BITS_USE_ASM返回asmbt(f,n);#其他DIVMOD_TEST(n,d,bm);返回t;#endif//BITS_USE_ASM}空集(ulong n)//设置第n位。{#如果定义了BITARRAY_ASSERTS贾塞尔特(n<n);#结束语#如果定义了BITS_USE_ASMasmbs(f,n);#其他DIVMOD(n,d,bm);f_[d]|=bm;#endif//BITS_USE_ASM}空隙清除(ulong n)//清除第n位。{#如果定义了BITARRAY_ASSERTS贾塞尔特(n<n);#结束语#如果定义了BITS_USE_ASMasmbr(f,n);#其他DIVMOD(n,d,bm);f[d]&=~bm;#endif//BITS_USE_ASM}空隙变化(ulong n)//切换第n位。{#如果定义了BITARRAY_ASSERTS贾塞尔特(n<n);#结束语#如果定义了BITS_USE_ASMasmbc(f,n);#其他DIVMOD(n,d,bm);f_[d]^=bm;#endif//BITS_USE_ASM}ulong测试集(ulong n)//测试是否设置了第n位并进行设置。{#如果定义了BITARRAY_ASSERTS贾塞尔特(n<n);#结束语#如果定义了BITS_USE_ASM返回asm_bts(f,n);#其他DIVMOD_TEST(n,d,bm);f_[d]|=bm;返回t;#endif//BITS_USE_ASM}ulong测试清除(ulong n)//测试是否设置了第n位并将其清除。{#如果定义了BITARRAY_ASSERTS贾塞尔特(n<n);#结束语#如果定义了BITS_USE_ASM返回asm_btr(f,n);#其他DIVMOD_TEST(n,d,bm);f[d]&=~bm;返回t;#结束语}ulong测试更改(ulong n)//测试是否设置了第n位并进行切换。{#如果定义了BITARRAY_ASSERTS贾塞尔特(n<n);#结束语#如果定义了BITS_USE_ASM返回asm_btc(f,n);#其他DIVMOD_TEST(n,d,bm);f_[d]^=bm;返回t;#endif//BITS_USE_ASM}无效clear_all()//清除所有位。{对于(ulong k=0;k-->