//-*-C++-*-//由autodoc自动生成//====~====头文件src/bits/average.h:==========静态内联ulong floor_average(ulong x,ulong y);//回程楼层((x+y)/2)//即使(x+y)不适合ulong,结果也是正确的//使用:x+y==((x&y)<<1)+(x^y)//即:sum==进位+sum without carries静态内联ulong cel_average(ulong x,ulong y);//返回天花板((x+y)/2)//即使(x+y)不适合ulong,结果也是正确的//使用:x+y==((x|y)<<1)-(x^y)//ceil_average(x,y)==平均值(x,y)+((x^y)&1))//====~====头文件src/bits/bin到sl-gray.h:==========静态内联ulong bin to_sl gray(ulong k,ulong ldn);//二进制SL-Gray的未分级://将二进制数转换为SL-Gray顺序中的相应单词。//连续过渡是相邻的(一个闭合)或三个闭合。//参见Joerg Arndt,Subset-lex:我们错过订单了吗?,(2014)// http://arxiv.org/abs/1405.6503静态内联ulong slgrayto_bin(ulong k,ulong ldn);//二进制SL-Gray的排名://将SL-Gray顺序中的二进制字转换为二进制数。//见Joerg Arndt,Subset lex:我们错过订单了吗?,(2014)// http://arxiv.org/abs/1405.6503//====~====头文件src/bits/bin2naf.h:==========静态内联void bin2naf(ulong x,ulong&np,ulong&nm);//计算x的(非相邻形式,NAF)有符号二进制表示://x-as的唯一表示//x=\sum_{k}{dk*2^k}其中dj\位于{-1,0,+1}//并且没有两个相邻的数字d_j、d_{j+1}都是非零的。//np设置了位j,其中dj==+1//nm设置了位j,其中dj==-1//我们有:x=np-nm静态内联ulong-naf2bin(ulong-np,ulong-nm);//bin2naf()的逆运算//也适用于签名二进制对np、nm//不是不相邻的形式。静态内联void bin2sbin(ulong x,ulong&np,ulong&nm);//计算x的有符号二进制表示://x as的表示//x=\sum_{k}{dk*2^k}其中dj\位于{-1,0,+1}//逆函数是naf2bin()。//======头文件src/bits/bit-dragon-r13.h:==========静态内联布尔位dragon_r13_turn(ulong&x);//递增基数-13单词x和//return(tr)是否为最低非零数字//递增单词的是3、6、8、9、11或12。//tr决定左转还是右转(90度)//采用R13分形。////从x==0开始://x变压器// ......... 0// ........1 0// .......一点一// .......11 0// ......1.. 0// ......一点一一// ......十一// ......111 1// .....1... 1// .....1..1 0// .....1.1. 1// .....一点一一一// .....11.. 0// ....1.... 0// ....1...1 0// ....1..1. 1// ....1..11 0// ....1.1.. 0// ....1.1.1 1// ....1.11. 0// ....一点一一一一// ....11... 1// ....11..1 0// ....11.1. 1// ....十一点一一一// ....111.. 0// ...1..... 0// ...1....1 0// ...1...1. 1////序列tr是不动点//0 |-->0010010110,1 |-->001 0010110111的同态。////也是态射的不动点(用0标识+,用1标识-)//F|-->F+F+F-F+F+F+F-F+F-F-F+F-F-F,+|-->+,-|-->-//====~====头文件src/bits/bit-dragon-r4.h:==========静态内联int bit_dragon_r4_turn(ulong&x);//增加基数-4单词x和//返回(tr)如下://+1,如果递增单词的最低非零位为1,//如果它是2,则为0,否则为-1(当它是3时)。//tr决定是向左(-1)、向右(+1)还是根本不向左(0)//(120度),采用R4-dragon分形。////序列tr开始// +0-++0-0+0--+0-++0-++0-0+0--+0-0+0-++0-0+0--+0--+0-++0-0+0--+0-////序列tr是态射的不动点// + |--> +0-+, 0 |--> +0-0, - |--> +0--////也是态射的不动点//F|-->F+F0F-F,0|-->0,-|-->-,+|-->+//(省略符号F后)////OEIS序列A035263给出了绝对值,//另请参见A029883(不同标志)。//====~====头文件src/bits/bit-dragon-r5.h:==========静态内联布尔位dragon_r5_turn(ulong&x);//增加基数-5单词x和//return(tr)是否为最低非零数字//增加的单词的数量大于2。//tr决定左转还是右转(90度)//具有R5-dragon分形。////从x==0开始://x变压器// ......... 0// ........1 0// .......一点一// .......11 1// ......1.. 0// .....1... 0// .....1..1 0// .....1.1. 1// .....一点一一一// .....11.. 0// ....1.... 0// ....1...1 0// ....1..1. 1// ....1..11 1// ....1.1.. 1// ....11... 0////序列tr是不动点//同态0|-->00110,1|-->00111。//参考OEIS序列A175337。////也是态射的不动点(用0标识+,用1标识-)//F|-->F+F+F-F-F,+|-->+,-|-->-//====~====头文件src/bits/bit-dragon-r7.h:==========静态内联布尔位dragon_r7_turn(ulong&x);//将基-7字x递增//return(tr)是否为最低非零数字//递增单词的是2、3或6。//tr决定左转还是右转(120度)//带有R7-dragon分形。////从x==0开始://x变压器// ......... 0// ........1 1// .......一点一// .......11 0// ......1.. 0// ......一点一一// ......十一// .....1... 0// .....1..1 1// .....1.1. 1// .....一点一一零// .....11.. 0// .....十一点一一// .....一百一十一点一// ....1.... 0// ....1...1 1// ....1..1. 1// ....1..11 0// ....1.1.. 0////序列tr是不动点//态射0|-->0100110,1|-->0110110。//参考OEIS序列A176405。////也是态射的不动点(用0识别+,用1识别-)//F|-->F+F-F-F+F+F-F,+|-->+,-|-->-静态内联int位dragon_r7_2_turn(ulong&x);//增加基数-7单词x和//根据最低非零数字d返回(tr)//递增单词的://d==[1,2,3,4,5,6]==>rt:=[0,+1,-1,-1,0]//(tr*120deg)是第二条R7龙的转弯处。////从x==0开始://x变压器// ......... 0// ........1 +// .......1. +// .......11 -// ......1.. -// ......一点一零// ......十一// .....1... 0// .....1..1 +// .....1.1. +// .....1.11 -// .....11.. -// .....十一点一零// .....111. +// ....1.... 0// ....1...1 +// ....1..1. +// ....1..11 -// ....1.1.. -// ....1.1.1 0// ....1.11. +// ....11... 0// ....11..1 +////序列tr是态射的不动点// 0 |--> 0++--00, + |--> 0++--0+, - |--> 0++--0-//参考OEIS序列A176416。////也是态射的不动点//F|-->F0F+F+F-F-F0F,+|-->+,-|-->-,0|-->0//====~====头文件src/bits/bit-dragon-r9.h:==========静态内联布尔位dragon_r9_turn(ulong&x);//增加基数-9个单词x和//return(tr)是否为最低非零数字//递增单词的是2、3、5或8。//tr决定左转还是右转(120度)//带有R9-dragon分形。////从x==0开始://x交易时间// ......... 0// ........1 1// .......一点一// .......11 0// ......1.. 1// ......一点一零// ......十一// ......111 1// .....1... 0// ....1.... 0// ....1...1 1// ....1..1. 1// ....1..11 0// ....1.1.. 1// ....1.1.1 0// ....1.11. 0// ....一点一一一一// ....11... 1// ...1..... 0// ...1....1 1// ...1...1. 1// ...1...11 0// ...1..1.. 1// ...1..1.1 0// ...1..11. 0// ...1..111 1// ...1.1... 1// ...11.... 0// ...11...1 1// ...11..1. 1////序列tr是不动点//同态0|-->011010010,1|-->011011。//也是0|-->011,1|-->010的不动点,因为// 0 |--> 011 |--> 011010010// 1 |--> 010 |--> 011010011//参见OEIS序列A156595。////也是态射的不动点(用0标识+,用1标识-)//F|-->F+F-F-F+F-F+F+F-F,+|-->+,-|-->-////也是态射的不动点//F|-->G+G-G,G|-->F-F+F,+|-->+,-|-->-//====~====头文件src/bits/bit-dragon3.h:==========静态内联bool bit_dragon3_turn(ulong&x);//递增基数-3单词x并返回(tr)//x中的个数是否减少。//tr决定左转还是右转(120度)//带有terdragon分形。////从x==0开始://x(二进制)tr x(三进制)// ........ 0 0 0 0// .......1 0 0 0 1// ......一点一零零二// .....1.. 0 0 1 0// .....一点一零零一一// .....十一点一零一二// ....1... 1 0 2 0// ....1..1 0 0 2 1// ....1.1. 1 0 2 2// ...1.... 0 1 0 0//序列tr(对于x>=1)是OEIS中的条目A080846,//态射0|-->010,1|-->011的不动点。//另请参见A060236(==1,2,1,1,2,2,1,2,1,1,1,1,2,1,2,1,2,1,1,2,…)。//同态射的不动点(对于k>0,用0标识+,用1标识-)//F|-->F+F-F,+|-->+,-|-->-//====~====头文件src/bits/bit-isolate.h:==========//提取转换附近的1、0或块。//这里我们假设外部比特都是零。//因此我们有//内部值(v)!=(interior_ones(v)|内部_ ones(~v))//忽略外部值的函数的名称以_xi结尾静态内联ulong single_ones(ulong x);//只返回x集合中孤立的单词。//假设外部值为0。静态内联ulong single_onesxi(ulong x);//只返回x集中孤立的单词。//忽略外部值。静态内联ulong single_zeros(ulong x);//只包含x集合的孤立零的返回字。//假设外部值为0。静态内联ulong single_zeros_xi(ulong x);//只包含x集合的孤立零的返回字。//忽略外部值。静态内联ulong单值(ulong x);//返回字,其中只设置了x的孤立的1和0。//假设外部值为0。静态内联ulong single_values_xi(ulong x);//返回字,其中只设置了x的孤立的1和0。//忽略外部值。静态内联ulong border_ones(ulong x);//返回单词,其中只有x中位于零旁边的那些被设置。静态内联ulong border_values(ulong x);//返回字,其中x的那些位被设置为位于转换上。//假设外部值为0。静态内联ulong high_border_ones(ulong x);//返回单词,其中只设置了x中的那些//它正好位于零(即下一个较低的位置)。静态内联ulong low_border_ones(ulong x);//返回单词,其中只设置了x中的那些//它位于零的左边(即在下一个更高的位置)。静态内联ulong block_border_ones(ulong x);//返回单词,其中只设置了x中的那些//在至少两个一块的边界上。静态内联ulong low_block_border_ones(ulong x);//返回单词,其中只设置了x中的那些//位于至少2个1的块的边界左侧。静态内联ulong high_block_border_ones(ulong x);//返回单词,其中只设置了x中的那些//位于至少2个1的块的边界右侧。静态内联ulong block_ones(ulong x);//返回单词,其中只设置了x中的那些//那是至少两个一块的一部分。静态内联ulong块值(ulong x);//返回仅设置x的那些位的字//不位于相反值的旁边。静态内联ulong interior ones(ulong x);//返回单词,其中只设置了x中的那些//左边或右边都没有零。静态内联ulong内部值(ulong x);//仅设置x值的返回字//双方都有过渡。//==============标题文件src/bits/bit项链.h:==========bit_necklace类;//二进制项链作为二进制单词。//生成循环最大单词。//必须有0=1)是OEIS的条目A014577。//另外:对于k>=1,如果seq(k)=1,则龙曲线向左,否则向右。//也是态射的不动点(对于k>0,用1标识+,用0标识-)//L|-->L+R+L-R,R|-->L+R-L-R,+|-->+,-|-->-//同态化的不动点(对于k>0)//L|-->L+R,R|-->L-R,+|-->+,-|-->-静态内联ulong bit_dragon_rot(ulong k);//返回总旋转(作为直角的倍数)//在龙曲线对应的k步之后//折纸顺序。//k=0、1、2、3、4、5。。。//序列(k)=0,1,2,1,2,3,2,1,2,3,4,3,2,3,2。。。//移动=+^-^-v-^-v+v-v-。。。//(+==右,-==左,^==上,v==下)。//序列是OEIS的条目A005811。//我们采用结果模4来忽略360度的倍数。//算法:计算gray_code(k)中的个数。静态内联布尔位_paper_fold_alt(ulong k);//交替折纸顺序的返回元件编号k://k=0、1、2、3、4、5。。。//序列(k)=0,1,0,0,1。。。//序列(对于k>=1)是OEIS的条目A106665。//此外:如果seq(k)=1,则相应曲线向左,否则向右。//同态射的不动点(对于k>0,用1标识+,用0标识-)//L|-->R+L+R-L,R|-->R+L-R-L,+|-->+,-|-->-静态内联ulong位_paper_fold_alt_rot(ulong k);//返回总旋转(作为直角的倍数)//在交替折纸曲线中k步之后。//k=0、1、2、3、4、5。。。//序列(k)=0,1,0,3,0,1。。。//移动=+^+v+^-^+^+v-v+//(+==右,-==左,^==上,v==下)。//算法:计算(w^gray_code(k))中的个数。静态内联布尔位_paper_fold_general(ulong k,ulong w);//一般折纸顺序的返回元件编号k://单词w的位号x决定是否//在步骤x中进行左折或右折。//如果w==0,结果是!位纸张折叠(k)。//w==~0时,结果为bit_paper_fold(k)。//带有~w的结果是带有w的结果的补码。静态内联ulong位_paper_fold_general_rot(ulong k,ulong w);//返回总旋转(作为直角的倍数)//在一般的折纸曲线上经过k步。//算法:计算(w^gray_code(k))中的个数。//当w==~0时,结果为bit_dragon_root(k)。//====~====头文件src/bits/bit-rll2.h:==========类bit_rll2;//长度受限(RLL)单词和斐波那契单词。//RLL单词按字典顺序排列,//斐波那契单词的变化顺序最小(格雷码)。//====~====头文件src/bits/bit-sl-gray.h:==========bit_sl_gray类;//最小变化顺序的二进制单词//相关的子法命令(“SL-Gray”命令)。//连续过渡大多是相邻的(一个闭合的),//否则距离为3(三接近)。//无回路算法。//====~====头文件src/bits/bit2adic.h:==========静态内联ulong inv2adic(ulong x);//返回反模2**BITS_PER_LONG//x必须是奇数//每一步正确位数增加一倍//===>执行循环道具。log_2(BITS_PER_LONG)次//精度为3、6、12、24、48、96。。。位(或更好)静态内联ulong invsqrt2adic(ulong d);//返回模2平方根倒数**BITS_PER_LONG//必须具有:d==1 mod 8//每一步正确位数增加一倍//===>执行循环道具。log_2(BITS_PER_LONG)次//精度为4、8、16、32、64。。。位(或更好)静态内联ulong sqrt2adic(ulong d);//返回模2平方根**BITS_PER_LONG//必须有:d==1 mod 8或d==4 mod 32,d==16 mod 128// ... d==4**k模块4**(k+3)//如果条件不成立,则结果未定义//======头文件src/bits/bit2pow.h:==========静态内联ulong ld(ulong x);//返回地板(log2(x)),//即返回k,使2^k<=x<2^(k+1)//如果x==0,则返回0(!)静态内联bool is_powof2(ulong x);//返回x==0(!)或x==2**k静态内联bool one_bit_q(ulong x);//返回x\在{1,2,4,8,16,…}中静态内联ulong next_pow_of2(ulong x);//如果x=2**k,则返回x//否则返回2**cel(log_2(x))//异常:x==0时返回0静态内联ulong next_expof2(ulong x);//如果x=2**k,则返回k,否则返回k+1。//异常:对于x==0,返回0。//====~====头文件src/bits/bitasm-amd64.h:==========静态内联ulong asm_bit_count(ulong x);静态内联ulong asm_bsf(ulong x);//位向前扫描静态内联ulong asm_bsr(ulong x);//位扫描反向静态内联ulong asm_bswap(ulong x);//字节交换静态内联ulong asm_rol(ulong x,ulong r);//向左旋转静态内联ulong asm_ror(ulong x,ulong r);//向右旋转静态内联ulong asm_prity(ulong x);//返回x的奇偶校验//AMD64奇偶校验标志的_complement_)。//由于奇偶校验仅用于低字节,//因此我们需要预先准备//x^=(x>>32);x^=(x>>16);x^=(x>>8);//在代码中静态内联ulong asmbt(constulong*f,ulong i);//钻头测试静态内联ulong asm_bts(ulong*f,ulong i);//位测试和设置静态内联void asmbs(ulong*f,ulong i);//位集合静态内联ulong asm_btr(ulong*f,ulong i);//位测试和重置静态内联void asmbr(ulong*f,ulong i);//位重置静态内联ulong asm_btc(ulong*f,ulong i);//位测试与补码静态内联void asmbc(ulong*f,ulong i);//位补码//====~====头文件src/bits/bitasm-i386.h:==========静态内联ulong asm_bsf(ulong x);//位向前扫描:返回最低的索引。静态内联ulong asm_bsr(ulong x);//反向位扫描:返回最高的索引。静态内联ulong asm_bswap(ulong x);//字节交换静态内联ulong asm_rol(ulong x,ulong r);//向左旋转静态内联ulong asm_ror(ulong x,ulong r);//向右旋转静态内联ulong asm_parity(ulong x);//返回x的奇偶校验//x86奇偶校验标志的_complement_)。//由于奇偶校验仅用于低字节,//因此我们需要做好准备//x^=(x>>16);x^=(x>>8);//在代码中静态内联ulong asmbt(constulong*f,ulong i);//钻头测试静态内联ulong asm_bts(ulong*f,ulong i);//钻头测试和设置静态内联void asmbs(ulong*f,ulong i);//位集合静态内联ulong asm_btr(ulong*f,ulong i);//位测试和重置静态内联void asmbr(ulong*f,ulong i);//位重置静态内联ulong asm_btc(ulong*f,ulong i);//位测试与补码静态内联void asmbc(ulong*f,ulong i);//位补码//====~====头文件src/bits/bitasm-sse.h:==========静态内联ulong sse_byte_zip(ulong x);//偶数索引中具有下半字节的返回字//奇数索引中的上半位。//.//比基于butterfly_8/16()的版本慢!//这显然不是SSE的初衷。//====~====头文件src/bits/bitasm.h:==========//======头文件src/bits/bitblock.h:==========静态内联ulong比特块(ulong p,ulong n);//返回以位p集合开始的长度为n的位块的字。//p和n都是有效的模BITS_PER_LONG。静态内联ulong cyclic_bit_block(ulong p,ulong n);//返回长度为n的字块,起始于设置的第p位。//结果可能围绕单词边界。//p和n都是有效的模BITS_PER_LONG。//====~====头文件src/bits/bitbutterfly.h:==========//butterfly_*()函数用于bit_zip()和bit_unzip(静态内联ulong butterfly_16(ulong x);//交换16位的两个中央块。静态内联ulong butterfly 8(ulong x);//在32位的每个块中交换8位的两个中心块。静态内联ulong butterfly4(ulong x);//在16位的每个块中交换4位的两个中央块。静态内联ulong butterfly2(ulong x);//在每个8位块中交换2位的两个中央块。静态内联ulong butterfly1(ulong x);//在每个4位块中交换两个中心位。//===========标题文件src/bits/bitcombcolex.h:==========静态内联ulong first_comb(ulong k);//返回k位的第一个组合(即最小字),//即00..001111..1(k低位集)//必须具有:0<=k<=BITS_PER_LONG静态内联ulong last_comb(ulong k,ulong n=BITS_PER_LONG);//返回k位(最大n位字)的最后一个组合//即1111..100..00(k高位集)//必须具有:0<=k<=n<=BITS_PER_LONG静态内联ulong nextcolexcomb(ulong x);//返回具有相同位数集的大于x的最小整数。////colex订单(5比3)://设置单词集反转(排序!)// 0 1 2 ..111 2 1 0// 0 1 3 .1.11 3 1 0// 0 2 3 .11.1 3 2 0// 1 2 3 .111. 3 2 1// 0 1 4 1..11 4 1 0// 0 2 4 1.1.1 4 2 0// 1 2 4 1.11. 4 2 1// 0 3 4 11..1 4 3 0// 1 3 4 11.1. 4 3 1// 2 3 4 111.. 4 3 2////示例:// 000001 -> 000010 -> 000100 -> 001000 -> 010000 -> 100000// 000011 -> 000101 -> 000110 -> 001001 -> 001010 -> 001100 -> 010001 -> ...// 000111 -> 001011 -> 001101 -> 001110 -> 010011 -> 010101 -> 010110 -> ...////特殊情况:// 0 -> 0//高端的所有位(即最后的组合)->0//.//基于Doug Moore/Glenn Rhoads的代码//注意:可能希望在末尾使用位扫描静态内联ulong nextcolexcomb(ulong x);//返回具有相同位数集的大于x的最小整数。////示例:(用“.”标记的位保持固定)//x=。。。。01111100000000//z=000000000 100000000(最低设置位)//v=x+z=。。。。10000000000000(一串后的第一个零)//v^x=00001111100000000//v^x/z=0000000000011111//v^x/z>>2=00000000000001111//next=。。。。10000000001111//.//代码基于Torsten Sillke的bitmani.h中的代码:// http://www.mathematik.uni-bielefeld.de/~sillke/算法///我可以在hakmem中找到算法,这是我的捷径。静态内联ulong prev_colex_comb(ulong x);//next_colex_comb()的反转//======头文件src/bits/bitcombminchange.h:==========静态内联ulong igc_next_minchange_comb(ulong x);//以最小变化顺序返回下一个组合的逆格雷码。//输入必须是当前组合的逆格雷码。//.//原始代码由Doug Moore编写。//只有我的化妆改变。静态内联ulong igc_next_minchange_comb(ulong x);//替代版本,更快。//固定摊销时间(CAT)。静态内联ulong igc_next_minchange_comb(ulong x,ulong k);//替代版本,使用的事实是//连续两个x的最小可能幂是2。//如果CPU有位计数指令,则速度应该很快。//k必须是x的位数//固定摊销时间(CAT)。//注意:此版本有2个参数。静态内联ulong igc_prev_minchange_comb(ulong x,ulong k);//以最小变化顺序返回前一个组合的逆格雷码。//输入必须是当前组合的逆格雷码。//固定摊销时间(CAT)。//输入==第一个,输出为n=BITS_PER_LONG的最后一个静态内联ulong igclastcomb(ulong k,ulong n);//返回最后一个组合的(逆格雷码//如igc_next_minchange_comb()中所示。////示例(n=6)c:=first_comb(n)==111111////k:f=first_seq(k)c^(f>>1)==返回// 0: ...... 111111(!)特殊情况:返回0==。。。。。。// 1: .....1 111111// 2: ....1. 11111.// 3: ...1.1 1111.1// 4: ..1.1. 111.1.// 5: .1.1.1 11.1.1// 6: 1.1.1. 1.1.1.静态内联ulong next_minchange_comb(ulong x,ulong last);//效率不高,仅解释igc_next_minchange_comb()的用法//必须有:last==igc_last_comb(k,n)////k==3,n==5的示例://x反转_灰度_代码(x)// ..111 ..1.1==第一顺序(k)// .11.1 .1..1// .111. .1.11// .1.11 .11.1// 11..1 1...1// 11.1. 1..11// 111.. 1.111// 1.1.1 11..1// 1.11. 11.11//1..11 111.1==igc_last_comb(k,n)//====~====头文件src/bits/bitcombshifts.h:==========类bit_comb_shifts;//按移位顺序的位组合。//======头文件src/bits/bitcopy.h:==========静态内联ulong copy_bit(ulong a、ulong isrc、ulong-idst);//将[isrc]处的位复制到位置[idst]。//返回修改后的单词。静态内联ulong-mask_copy_bit(ulong a、ulong-msrc、ulong mdst);//根据src-mask(msrc)复制位//根据dest-mask(mdst)发送到位。//msrc和mdst必须正好有一个位集。//返回修改后的单词。静态内联ulong-mask_or-bit(ulong a、ulong-msrc、ulong mdst);//或根据src-mask(msrc)的位//根据dest-mask(mdst)发送到位。//msrc和mdst必须正好有一个位集。//如果已知mdst位置为零,则此函数//等效于mask_copy_bit()。//返回修改后的单词。//======头文件src/bits/bitcount.h:==========静态内联ulong比特计数(ulong x);//返回设置位数。//为x=0、1、2、3…返回的值序列。。。// 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, ...//(OEIS序列A000120)。静态内联ulong bit_count_15(ulong x);//返回的设置位数,最多必须有15个设置位数。静态内联ulong比特计数3(ulong x);//返回的设置位数,必须最多有3个设置位数。静态内联int bit_count_cmp(constulong&a,constulon&b);//比较a和b的位计数。静态内联ulong bit_count_sparse(ulong x);//返回设置的位数。静态内联ulong bit_count_dense(ulong x);//返回设置的位数。//循环(bit_count_sparse()的)将为执行一次//x的每个未设置位(即零)。静态内联ulong位块计数(ulong x);//返回位块的数量。//例如:// ..1..11111...111. -> // ...1..11111...111 -> 3// ......1.....1.1.. -> 3// .........111.1111 -> 2静态内联ulong位块ge2计数(ulong x);//返回至少包含2位的位块数。//例如:// ..1..11111...111. -> 2// ...1..11111...111 -> 2// ......1.....1.1.. -> 0// .........111.1111 -> 2静态内联ulong bit_count_01(ulong x);//返回字中的位数//用于特殊形式00…0001…11的单词//-----SRCFILE=src/bits/bitcount-v.cc:-----ulong比特计数v(常数x,ulong n);//返回和(j=0,n-1,bit_count(x[j]))//====~====头文件src/bits/bitcyclic-dist.h:==========静态内联ulong bit_cyclic_dist(ulong a,ulong b);//返回(t^b)的最小位数//其中t通过a的循环旋转。静态内联ulong bit_cyclic_dist(ulong a,ulong b,ulongn);//返回(t^b)的最小位数//其中t通过a的循环旋转。//使用n位单词。//====~====头文件src/bits/bitcyclic-match.h:==========静态内联ulong bit_cyclic_match(ulong x,ulong y);//如果x==rotate_reright(y,r),则返回r,否则返回~0UL。//换句话说:return//右参数必须向右旋转的频率(以匹配左侧)//或者,相当于://左参数必须向左旋转的频率(以匹配右参数)静态内联ulong位循环匹配(ulong x,ulong y,ulongn);//如果x==rotate_right(y,r,n),则返回r,否则返回~0UL//(使用n位字)静态内联ulong位_cyclic_dist1_match(ulong x,ulong y);//返回最小r,以便//c=(x^rotate_reright(y,r,n))是一个一位字。//如果没有这样的r,则返回~0UL。静态内联ulong bit_cyclic_dist1_match(ulong x,ulong y,ulongn);//返回最小r,以便//c=(x^rotate_reright(y,r,n))是一个一位字。//如果没有这样的r,则返回~0UL。//(使用n位字)//====~====头文件src/bits/bitcyclic-minmax.h:==========静态内联ulong bit_cyclic_min(ulong x);//返回x的所有旋转的最小值静态内联ulong bit_cyclic_min(ulong x,ulong n);//使用n位字返回x的所有旋转的最小值静态内联ulong bit_cyclic_max(ulong x);//返回x的所有旋转的最大值静态内联ulong bit_cyclic_max(ulong x,ulong n);//使用n位字返回x的所有旋转的最大值静态内联bool is_bit_cyclic_min(ulong x);//返回x是否为x所有旋转的最小值静态内联bool is_bit_cyclic_min(ulong x,ulong n);//返回x是否是作为n位字的x的所有旋转的最小值静态内联bool is_bit_cyclic_max(ulong x);//返回x是否为x所有旋转的最大值静态内联bool is_bit_cyclic_max(ulong x,ulong n);//返回x是否是x所有旋转的最大值,作为n位字//======头文件src/bits/bitcyclic-period.h:==========静态内联ulong位周期(ulong x);//返回将x转换为自身的最小正位。//(与bit_cyclic_period(x,BITS_PER_LONG)相同)////返回值是单词长度的除数,//即1,2,4,8,。。。,位_每_长。静态内联ulong比特周期(ulong x,ulong n);//返回将x转换为自身的最小正位。//(使用n位字)//返回的值是n的除数。////n=6的示例://单词句点// ...... 1// .....1 6// ....11 6// ...一点一六// ...111 6// ..1..1 3// ..一点一一六// ..十一点一六// ..1111 6// .1.1.1 2// .1.111 6// .11.11 3// .11111 6// 111111 1//====~====头文件src/bits/bitcyclic-xor.h:==========静态内联ulong位循环rxor(ulong x);//与格雷码类似,但比特移位//右边移到最高点。//返回的字设置了偶数位数。静态内联ulong位循环rxor(ulong x,ulong n);//n位字的版本静态内联ulong bit_cyclic_inv_rxor(ulong x);//返回v,使bit_cyclic_rxor(v)==x。//~v也有同样的关系。//x必须具有偶数位数。//对于有效输入,结果的最低位为零。//也是任意n的位_cyclic_rxor(x,n)的逆。静态内联ulong bit_cyclic_lxor(ulong x);//与反向格雷码类似,但位移位//从左边移到最低位。//返回的字设置了偶数位数。静态内联ulong位循环lxor(ulong x,ulong n);//n位字的版本静态内联ulong bit_cyclic_inv_lxor(ulong x);//返回v,使bit_cyclic_lxor(v)==x。//~v也有同样的关系。//x必须具有偶数位数。//对于有效输入,结果的最高位为零。//也是任意n的位_cyclic_lxor(x,n)的逆。//====~====头文件src/bits/bitfibgray.h:==========bit_fibgray类;//带有二进制字的斐波那契格雷码。//====~====头文件src/bits/bitgather.h:==========静态内联ulong位聚集(ulong w,ulong m);//返回字,其中收集了w位,如m所示://示例://w=ABCDEFGH//m=00101100//==>00000 CEF//这是bit_scatter()的倒数静态内联ulong bit_scatter(ulong w,ulong m);//返回字,其中w的位按m分配://示例://w=00000 ABC//m=00101100//==>00A0BC00//这与bit_gather()相反//====~====头文件src/bits/bitgraypermute.h:==========静态内联ulong left_swap_16(ulong x);//返回64位字,并交换最左侧的两个四分之一。静态内联ulong left_swap8(ulong x);//交换每个32位块最左边的两个四分之一的返回字。静态内联ulong left_swap4(ulong x);//交换每个16位块最左边的两个四分之一的返回字。静态内联ulong left_swap2(ulong x);//每个8位块的最左边四分之二被交换的返回字。静态内联ulong left_swap1(ulong x);//交换每个4位块最左边的两个位的返回字。静态内联ulong bit_gray_permute(ulong x);//返回带灰度位的单词。静态内联ulong bit_inverse_gray_permute(ulong x);//bit_gray_permute()的反转//====~====头文件src/bits/bitheghdge.h:==========静态内联ulong highest_one_01edge(ulong x);//返回字,其中来自(包括)//设置最高设置位到位0。//如果未设置位,则返回0。////将结果输入bit_count()以获取//最高位集的索引。静态内联ulong highest_one_10edge(ulong x);//返回字,其中来自(包括)//设置最高设置位至最高有效位。//如果未设置位,则返回0。//====~====头文件src/bits/bithigh.h:==========静态内联ulong highest_one(ulong x);//仅设置x中最高位的返回字。//如果未设置位,则返回0。静态内联ulong最高零(ulong x);//返回仅设置x中最高未设置位的字。//如果设置了所有位,则返回0。静态内联ulong set_highest_zero(ulong x);//设置x中最高未设置位的返回字。//对于输入==~0,返回~0。静态内联ulong highest_one_idx(ulong x);//返回最高位集的索引。//如果未设置位,则返回0。静态内联ulong highest_zero_idx(ulong x);静态内联ulong高零点(ulong x);//设置所有(高端)零的返回字。//例如:00011001-->11100000//如果设置了最高位,则返回0:// 11011001 --> 00000000静态内联ulong high_ones(ulong x);//返回设置了所有(高端)1的单词。//例如11001011-->11000000//如果最高位为零,则返回0:// 01110110 --> 00000000//====~====头文件src/bits/bitldeq.h:==========静态内联布尔ldeq(ulong x,ulong y);//返回floor(log2(x))==floor(log2(y))。//对于参数0和1(任意顺序)//ld_eq(x,y)正确返回false//而ld(x)==ld(y)为真//(因为ld(x)对于x==1和x==0都返回0)。静态内联布尔ld_neq(ulong x,ulong y);//返回楼层(log2(x))=地板(log2(y))//====~====头文件src/bits/bitlex.h:==========静态内联ulong next_lexrev(ulong x);//以subset-lexrev顺序返回下一个单词。//从位置n-1到的一位单词开始//生成长度n的2*n个子集。//例如,对于n==4,子集为//{0,1,2,3}的词子集// 1... {0}// 11.. {0, 1}// 111. {0, 1, 2}// 1111 {0, 1, 2, 3}// 11.1 {0, 1, 3}// 1.1. {0, 2}// 1.11 {0, 2, 3}// 1..1 {0, 3}// .1.. {1}// .11. {1, 2}// .111 {1, 2, 3}// .1.1 {1, 3}// ..1. {2}// ..11 {2, 3}// ...1 {3}// .... {}//注(1):子集的第一个元素对应//到最高设置位。解释二进制时//单词通过“bit(n)==element n”(通常),顺序//将是:// 1... { 3 }// 11.. { 2, 3 }// 111. { 1, 2, 3 }// 1111 { 0, 1, 2, 3 }// 11.1 { 0, 2, 3 }// 1.1. { 1, 3 }// 1.11 { 0, 1, 3 }// 1..1 { 0, 3 }// .1.. { 2 }// .11. { 1, 2 }// .111 { 0, 1, 2 }// .1.1 { 0, 2 }// ..1. { 1 }// ..11 { 0, 1 }// ...1 { 0 }//注(2):delta集合的lex顺序很简单//是(单词或颠倒单词的)计数顺序//取决于上述解释)。静态内联ulong prev_lexrev(ulong x);//以subset-lexrev顺序返回前一个单词。//从零开始,使用2**n个调用//生成长度n的2*n个子集。//例如,对于n==4:// .... = 0// ...1 = 1// ..11 = 3// ..1. = 2// .1.1 = 5// .111 = 7// .11. = 6// .1.. = 4// 1..1 = 9// 1.11 = 11// 1.1. = 10// 11.1 = 13// 1111 = 15// 111. = 14// 11.. = 12// 1... = 8//静态内联ulong negidx2lexrev(ulong k);////k:负数x2lexrev(k)// 0: .....// 1: ....1// 2: ...11// 3: ...1// 4: ..1.1// 5: ..111// 6: ..11// 7: ..1..// 8: .1..1// 9: .1.11// 10: .1.1.// 11: .11.1// 12: .1111// 13: .111.// 14: .11..// 15: .1...// 16: 1...1//静态内联ulong lexrev2negidx(ulong x);//negidx2lexrev()的逆运算静态内联bool is_lexrev_fixedpoint(ulong x);//返回x是否是prev_lexrev()-sequence中的固定点//======头文件src/bits/bitlow-edge.h:==========静态内联ulong lowest_one_10edge(ulong x);//返回字,其中来自(包括)//设置最低设置位至最高有效位。//如果未设置位,则返回0。//示例:00110100-->111111 00静态内联ulong lowest_one_01edge(ulong x);//返回字,其中来自(包括)//设置最低设置位至最低有效位。//如果未设置位,则返回0。//示例:00110100-->00000111//======头文件src/bits/bitlow.h:==========静态内联ulong lowest_one_idx(ulong x);//返回最低位集的索引。//位索引范围从零到BITS_PER_LONG-1。//示例:// ***1 --> 0// **10 --> 1// *100 --> 2//如果未设置位,则返回0(同样)。静态内联ulong lowest_one_idx_parity(ulong x);//返回最低设置位索引的奇偶校验。//x=0时返回零。//x>=0的序列(OEIS序列A096268):// 0,0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,...静态内联ulong lowest_one(ulong x);//仅设置x中最低设置位的返回字。//如果未设置位,则返回0。静态内联ulong lowest_zero(ulong x);//仅设置x中未设置的最低位的返回字。//如果设置了所有位,则返回0。静态内联ulong lowest_block(ulong x);//隔离最低的块。静态内联ulong clear_lowest_one(ulong x);//在x中设置的最低位被清除的位置返回字。//输入==0时返回0。静态内联ulong set_lowest_zero(ulong x);//设置x中最低未设置位的返回字。//对于输入==~0,返回~0。静态内联ulong low_ones(ulong x);//返回所有(低端)设置的单词。//示例:01011011-->00000011//如果最低位为零,则返回0:// 10110110 --> 0静态内联ulong low_zeros(ulong x);//设置所有(低端)零的返回字。//示例:01011000-->00000111//如果设置了所有位,则返回0。静态内联ulong low_match(ulong x,ulong y);//包含x和y匹配的低端所有位的返回字。//如果x=*0W且y=*1W,则返回00W。//====~====头文件src/bits/bitperiodic.h:==========静态内联ulong比特复制周期(ulong a,ulong p);//由重复项的最低p位组成的返回字。//例如:如果p==3且a=*****xyz(8位),则返回yzxyzxyz。//必须有p>0。静态内联ulong比特复制周期(ulong a、ulong p、ulong-ldn);//由重复的最低p位组成的返回字//在最低ldn位中(高位为零)。//例如:如果p==3,ldn=7和a=*****xyz(8位),则返回0zxyzxyz。//必须具有p>0和ldn>0。//====~====头文件src/bits/bitrotate.h:==========静态内联ulong bit_rotate_left(ulong x,ulong r);//返回字向左旋转r位//(即朝向最高有效位)//.//GCC将函数优化为asm“roll%cl,%ebx”静态内联ulong bit_rotate_right(ulong x,ulong r);//返回字向右旋转r位//(即朝向最低有效位)//.//GCC将函数优化为asm“errl%cl,%ebx”静态内联ulong bit_rotate_sgn(ulong x,long r);//正r-->从元素零移开静态内联ulong bit_rotate_left(ulong x,ulong r,ulong n);//将n位字旋转r位返回到左侧//(即朝向最高有效位)//必须有0<=r<=n静态内联ulong bit_rotate_right(ulong x、ulong r和ulong n);//将n位字旋转r位返回到右侧//(即朝向最低有效位)//必须有0<=r<=n静态内联ulong bit_rotate_sgn(ulong x,long r,ulong n);//正r-->从元素零移开//====~====头文件src/bits/bitseparate.h:==========静态内联ulong bit_separate(ulong w,ulong m,ulongs=BITS_PER_LONG/2);//返回字,其中w的位按m分隔。//m为0/1的位置的位移到低端/高端。//示例://w=ABCDEFGH//m=00111100//==>CDEFABGH公司////w=ABCDEFGH//m=01010101//==>BDFHACEG公司////s必须包含以m为单位设置的个数。//对于默认值s,正好一半的位必须以m为单位设置静态内联ulong bit_separate_subwords(ulong w、ulong m、ulong s);//位分隔w的所有长度为s的子字。//s>=2必须除以BITS_PER_LONG。//掩码必须正好是位的一半//在每个子字中都设置了。//示例://s=4//w=EFGH EFGH//m=0011 1010//==>CDAB EGFH////s=2//w=AB CD EF GH//m=01 10 01 10//==>BA CD FE GH////对于s==BITS_PER_LONG,结果与bit_separate(w,m)相同//如果m的比特的一半被设置。//====~====头文件src/bits/bitsequency.h:==========静态内联ulong位序列(ulong x);//返回零一(或一零)的数字//x的跃迁(序列)。静态内联ulong first_sequency(ulong k);//返回第一个(即最小的)单词,其顺序为k,//例如00..00010101010(序列8)//例如00..00101010101(序列9)//必须具有:0<=k<=BITS_PER_LONG静态内联ulong last_sequency(ulong k,ulong n=BITS_PER_LONG);//返回最后一个(即最大的)单词,并带有顺序k。静态内联ulong next_sequency(ulong x);//返回具有相同数字的下一个单词//零-one跃迁(序列)的x。//最低位的值是保守的。////没有其他序列时返回零。////例如:// ...1.1.1 ->// ..11.1.1 ->// ..1..1.1 ->// ..1.11.1 ->// ..1.1..1 ->// ..1.1.11 ->// .111.1.1 ->// .11..1.1 ->// .11.11.1 ->// .11.1..1 ->// .11.1.11 -> ...//静态内联ulong prev_sequency(ulong x);静态内联ulong补码序列(ulong x);//序列为BITS_PER_LONG-s的返回字//其中s是x的序列//====~====头文件src/bits/bitset2set.h:==========静态内联ulong位集2(ulong b,ulong*f,ulongn,ulong-off=0);//b=[1…1.11]==>f[]=[0,1,3,7],返回=4//关闭=1==>f[]=[1,2,4,8],返回=4静态内联ulong集合2bitset(constulong*f,ulong n,ulong-off=0);//f[]=[0,1,3,7]==>返回=[1…1.11]//f[]=[1,2,4,8]且off=1时返回相同静态内联ulong位集2deltaset(ulong b,ulong*f,ulongn);//b=[1…1.11]==>f[]=[1,1,0,1,0,0,1],返回值=4静态内联ulong deltaset2bitset(constulong*f,ulong n);//f[]=[1,1,0,1,0,0,1]==>返回=[1…1.11]//====~====头文件src/bits/bitsperlong.h:==========//====~====头文件src/bits/bitsubset-gray.h:==========类bit_subset_gray;//生成给定单词的所有比特子集,//格雷码(最小变化)顺序。////例如,对于单词(为未设置位打印的“.”)// ...11.1.//这些单词由后续的next()-调用生成:// ......1// ....1.1.// ....1...// ...11...// ...11.1.// ...1..1.// ...1....// ........//==============标题文件src/bits/bitsubset.h:==========类bit_subset;//生成给定单词的所有比特子集。////例如,对于单词(为未设置位打印的“.”)// ...11.1.//这些单词由后续的next()-调用生成:// ......1// ....1...// ....1.1.// ...1....// ...1..1.// ...11...// ...11.1.// ........////====~====头文件src/bits/bitsubsetq.h:==========静态内联bool is_subset(ulong u,ulong e);//返回u的集合位是否是e的集合位的子集。//也就是说,作为位集,测试u是否是e的子集。静态内联bool is_proper_subset(ulong u,ulong e);//返回u(作为位集)是否是e的适当子集。//====~====头文件src/bitswap.h:==========静态内联ulong位_swap01(ulong a,ulong k1,ulong-k2);//返回交换了位置[k1]和[k2]的位的。//位必须具有不同的值(!)//(即一个为零,另一个为)//允许k1==k2(a不变)静态内联ulong bit_swap(ulong a,ulong k1,ulong-k2);//返回a,其中[k1]和[k2]位置的位已交换。//允许k1==k2(a不变)静态内联ulong bit_swap1(ulong x);//返回x并交换相邻位。静态内联ulong bit_swap2(ulong x);//返回交换了2位组的x。静态内联ulong bit_swap4(ulong x);//返回交换了4位组的x。静态内联ulong bit_swap_8(ulong x);//返回交换了8位组的x。静态内联ulong位_swap16(ulong x);//返回交换了16位组的x。////对于32位字,这与//rotate_left(x,16)或rotate_reright(x,十六)静态内联ulong位_swap32(ulong x);//返回x,交换32位的组。//====~====头文件src/bits/bittest.h:==========静态内联ulong测试比特(ulong a,ulong i);//如果位[i]为零,则返回零,//否则返回设置了位[i]的一位字。静态内联bool test_bit01(ulong a,ulong i);//返回是否设置了位[i]。静态内联ulong set_bit(ulong a,ulong i);//返回设置了位[i]的。静态内联ulong clear_bit(ulong a,ulong i);//返回已清除位[i]的。静态内联ulong change_bit(ulong a,ulong i);//返回位[i]已更改的。//====~====头文件src/bits/bittransforms.h:==========静态内联ulong blue-code(ulong a);//自反转。//范围[0..2^k-1]映射到自身//工作\prop log_2(BITS_PER_LONG)//.//B:=蓝色,G:=灰色,I:=反灰色//G(B(G(B)(a)))==a//G(B(G(a)))==B(a)//I(B(I(a)))==B(a)//G(B(a))==B(I(a)//P:=奇偶校验//P(B(a))==a%2静态内联ulong黄色代码(ulong a);//自反转。//工作\prop log_2(BITS_PER_LONG)//.//Y:=黄色,B:=蓝色,r:=转速//B(a)==Y(r(Y(a)))//Y(a)==r(B(r(a)))//r(a)==Y(B(Y(a)))//P:=奇偶校验//P(Y(a))==最高一个(a)==“符号(a)”静态内联ulong red代码(ulong a);//工作\prop log_2(BITS_PER_LONG)//=^=转速(蓝色代码(a));静态内联ulong green_code(ulong a);//工作\prop log_2(BITS_PER_LONG)//=^=转速(黄色代码(a));//===========标题文件src/bits/bitxtransforms.h:==========静态内联ulong bluex代码(ulong a,ulong x);静态内联ulong黄色代码(ulong a,ulong x);静态内联ulong红色代码(ulong a,ulong x);静态内联ulong green_xcode(ulong a,ulong x);//====~====头文件src/bits/bitzip-pairs.h:==========静态内联ulong bit_zip0_pairs(ulong x);//偶数(对-)索引中具有下半位(-对)的返回字,//即指数4k+0、4k+1。//上半部分必须为零。//0000abcd-->0a0b0c0d(a、b、c、d是位对)。静态内联ulong bit_unzip0_pairs(ulong x);//将偶数位置(4k+0、4k+1)的成对比特收集到下半部分。//bit_zip0_pairs()的倒数。//奇数(对)位置(4k+2,4k+3)的位对必须为零。//0a0b0c0d-->0000abcd(a、b、c、d是位对)。//====~====头文件src/bits/bitzip.h:==========静态内联ulong bit_zip(ulong x);//偶数索引中具有下半位的返回字//奇数索引中的上半位。静态内联ulong bit_unzip(ulong x);//下半部分具有偶数索引位的返回字//和上半部分中的奇数索引位。//bit_zip()的反转静态内联ulong bit_zip0(ulong x);//在偶数索引中具有下半位的返回字。//上半部分必须为零。//效果与bit_zip()相同,但速度更快。//0000abcd-->0a0b0c0d(a、b、c、d是位)。静态内联ulong bit_unzip0(ulong x);//将均匀位置的钻头收集到下半部。//bit_zip0()的反转。//奇数位置的位必须为零。//0a0b0c0d-->0000abcd(a、b、c、d是位)。静态内联void bit_zip2(ulong x、ulong&lo、ulong&hi);//下半部分单词的位分散到lo的偶数位置,//上半个单词的位分散到hi的偶数位置。静态内联ulong bit_unzip2(ulong-lo,ulong-hi);//bit_zip2(x,lo,hi)的倒数。静态内联ulong bit_zip2(ulong x,ulong y);//2字版本://只有x和y的下半部分被合并静态内联void bit_unzip2(ulong t、ulong&x、ulong-y);//2字版本://只有x和y的下半部分被填充//====~====头文件src/bits/blue-fixed-points.h:==========静态内联ulong blue_fixedpoint(ulong s);//为每个参数返回blue_code()的唯一固定点。//.//前几个固定点(bfp)是://arg=arg_2:bfp_2=bfp// 0 = ...... : .......... = 0// 1 = .....1 : .........1 = 1// 2 = ....1. : .......11. = 6// 3 = ....11 : .......111 = 7// 4 = ...1.. : .....1.1.. = 20// 5 = ...1.1 : .....1..1. = 18// 6 = ...11. : .....1.1.1 = 21// 7 = ...111 : .....1..11 = 19// 8 = ..1... : ...1111... = 120// 9 = ..1..1 : ...11.11.. = 108// 10 = ..1.1. : ...111111. = 126// 11 = ..1.11 : ...11.1.1. = 106// 12 = ..11.. : ...1111..1 = 121// 13 = ..11.1 : ...11.11.1 = 109// 14 = ..111. : ...1111111 = 127// 15 = ..1111 : ...11.1.11 = 107// 16 = .1.... : .1...1.... = 272// 17 = .1...1 : .1.11.1... = 360静态内联ulong blue_fixedpoint_idx(ulong f);//blue_fixed_point()的反转//====~====头文件src/bits/branchless.h:==========//一些避免if-statements的函数。//upos_*()函数仅在有限范围内工作//为了使最高位模拟进位标志。//诀窍是使用带符号的右移来获得掩码//其中==0xfff。。。如果发生进位或其他为零。////使用具有条件移动指令的CPU//编译器应该生成无分支的机器代码。//GCC做到了这一点(在许多情况下;请检查以确保)。静态内联ulong upos_max(ulong a,ulong b);//返回最大值(a,b)//a和b都不能有最高有效位集静态内联ulong upos_min(ulong a,ulong b);//最小返回值(a,b)//a和b都不能有最高有效位集静态内联ulong upos_abs_diff(ulong a,ulong b);//返回abs(a-b)//a和b都不能有最高有效位集静态内联void upos_sort2(ulong&a,ulong&b);//集合{a,b}:={min(a,b),max(a,b)}//a和b都不能有最高有效位集静态内联ulong upos_add_sat(ulong a,ulong b);//返回a+b//如果结果溢出,则返回0xfff。。。//a和b都不能有最高有效位集静态内联ulong upos_sub_sat(ulong a,ulong b);//返回a-b//如果结果下溢,则返回零//a和b都不能有最高有效位集静态内联ushort add_sat16(ushort a,ushort b);//添加两个16位数字//如果结果溢出,则返回0xffff。//必须具有:sizeof(int)==4静态内联ushort sub_sat16(ushort a,ushort b);//添加两个16位数字//如果结果下溢,则返回零。//必须具有:sizeof(int)==4静态内联long max0(long x);//返回最大值(0,x),即负输入返回零//输入范围无限制静态内联long min0(long x);//返回最小值(0,x),即正输入返回零//输入范围无限制静态内联长clip_range0(long x,long m);//等效代码(对于m>0)为://如果(x<0)x=0;//否则,如果(x>m)x=m;//返回x;静态内联长clip_range(long x,long mi,long ma);//代码等价于(对于mi<=ma)://如果(xma)x=ma;//====~====头文件src/bits/colormix-fl.h:==========//对32位整数的各种操作,其中有3个颜色通道//8位中的应为最低有效24位。//顺序(例如0x00RRGGBB与0x00BBGGRR)无关紧要。//此文件包含浮点缩放操作//数字。请注意,转换浮点数<-->int很昂贵。静态内联uint fl_color01(uint c,双v);// 0.0 ... +1//0 c2静态内联uint fl_color11(uint c,双v);// -1.0 ... 0.0 ... +1//补码(c)0c静态内联uint fl_color_mix_11(uint c1,uint c2,double v);// -1.0 ... 0.0 ... +1//c1(c1+c2)/2 c2静态内联uint fl_color_mix_1b1(uint c1,uint c2,双v);// -1.0 ... 0.0 ... +1//c1 0 c2//==============标题文件src/bits/colormix.h:==========//对32位整数的操作,其中有3个颜色通道//8位中的应为最低有效24位。//顺序(例如0x00RRGGBB与0x00BBGGRR)无关紧要。静态内联uint color01(uint c,ulong v);//返回按v缩放的每个通道的颜色//0<=v<=(1<<16)对应于0.0。。。1静态内联uint color_mix(uint c1、uint c2、ulong v);//返回通道平均颜色:(1.0-v)*c1+v*c2//0<=v<=(1<<16)对应于0.0。。。1//c1。。。二氧化碳静态内联uint color_mix50(uint c1,uint c2);//返回颜色c1和c2的通道平均值//特殊情况的快捷方式(50%透明度)//颜色_mix的(c1,c2,“0.5”)//忽略最低有效位//(在所有函数color_mix_NN()中)静态内联uint color_mix25(uint c1,uint c2);静态内联uint color_mix_75(uint c1,uint c2);静态内联uint color_mix25(uint c1、uint c2、uint c 3);静态内联uint color_mix_50(uint c1、uint c2、uint c 3);静态内联uint color_mix_75(uint c1、uint c2、uint c 3);静态内联uint color_sum_adjust(uint);//如果发生溢出,请将颜色通道设置为最大值(0xff)//(即,设置通道中最左边的位)静态内联uint color_sum(uint c1,uint c2);//返回颜色c1和c2的信道饱和和。//忽略最低有效位。静态内联uint color_sum(uint c0、uint c1和uint c2);//返回颜色c0、c1和c2的信道饱和和。//忽略最低有效位。静态内联uint color_mult(uint c1,uint c2);//返回颜色c1和c2的通道乘积。//对应于颜色为c1的对象//用c2色光照明//====~====头文件src/bits/colormixp.h:==========//colormix.h中某些函数的版本//不要忽略最低有效位//(而且更贵)。////非“完美”版本应该可以//大多数应用程序。静态内联uint perfect_color_mix50(uint c1,uint c2);//返回颜色c1和c2的通道平均值静态内联uint perfect_color_mix75(uint c1,uint c2);静态内联uint perfect_color_sum(uint c1,uint c2);静态内联uint perfect_color_sum(uint c0,uint c1,uint c2);//====~====头文件src/bits/crc32.h:==========crc32级;//32位CRC(循环冗余检查)//====~====头文件src/bits/crc64.h:==========crc64类;//64位CRC(循环冗余检查)//===========标题文件src/bits/cswap.h:==========静态内联void cswaplt(ulong&a,ulong&b);//无分支等效于://如果(a)b){ulong t=a;a=b;b=t;}//如果a>b,则交换//====~====头文件src/bits/evenodd.h:==========//====~====头文件src/bits/fibrep-subset-lexrev.h:==========静态内联ulong next_subset_lexrev_fib(ulong x);//以子lex顺序返回下一个斐波那契单词。//从位置n-1到的一位单词开始//生成长度为n的所有斐波那契单词//例如,对于n==6,单词(和子集)为//{0,1,2,3,4,5}的词子集// 1: 1..... = { 0 }// 2: 1.1... = { 0, 2 }// 3: 1.1.1. = { 0, 2, 4 }// 4: 1.1..1 = { 0, 2, 5 }// 5: 1..1.. = { 0, 3 }// 6: 1..1.1 = { 0, 3, 5 }// 7: 1...1. = { 0, 4 }// 8: 1....1 = { 0, 5 }// 9: .1.... = { 1 }// 10: .1.1.. = { 1, 3 }// 11: .1.1.1 = { 1, 3, 5 }// 12: .1..1. = { 1, 4 }// 13: .1...1 = { 1, 5 }// 14: ..1... = { 2 }// 15: ..1.1. = { 2, 4 }// 16: ..1..1 = { 2, 5 }// 17: ...1.. = { 3 }// 18: ...1.1 = { 3, 5 }// 19: ....1. = { 4 }// 20: .....1 = { 5 }// 21: ...... = { }////注(1):子集的第一个元素对应//到最高设置位。//注(2):delta集合的lex顺序很简单//是计数顺序。静态内联ulong prev_subset_lexrev_fib(ulong x);//以子lex顺序返回前面的Fibonacci单词。//从零开始生成长度为n的所有单词。//例如,对于n==6://{0,1,2,3,4,5}的词子集// 0: ...... = { }// 1: .....1 = { 5 }// 2: ....1. = { 4 }// 3: ...1.1 = { 3, 5 }// 4: ...1.. = { 3 }// 5: ..1..1 = { 2, 5 }// 6: ..1.1. = { 2, 4 }// 7: ..1... = { 2 }// 8: .1...1 = { 1, 5 }// 9: .1..1. = { 1, 4 }// 10: .1.1.1 = { 1, 3, 5 }// 11: .1.1.. = { 1, 3 }// 12: .1.... = { 1 }// 13: 1....1 = { 0, 5 }// 14: 1...1. = { 0, 4 }// 15: 1..1.1 = { 0, 3, 5 }// 16: 1..1.. = { 0, 3 }// 17: 1.1..1 = { 0, 2, 5 }// 18: 1.1.1. = { 0, 2, 4 }// 19: 1.1... = { 0, 2 }// 20: 1..... = { 0 }////====~====头文件src/bits/fibrep.h:==========静态内联ulong bin2fibrep(ulong b);//返回b的斐波那契表示//限制:第一个Fibonacci数较大//b必须表示为ulong。//32位:b<2971215073=F(47)[F(48)=4807526976>2^32]//64位:b<12200160415121876738=F(93)[F(94)>2^64]静态内联ulong fibrep2bin(ulong f);//返回f的二进制表示//bin2fibrep()的逆运算。静态内联ulong next_fibrep(ulong x);//其中x是n的斐波那契表示//返回n+1的斐波那契表示。静态内联ulong prev_fibrep(ulong x);//用x表示n的斐波那契表示//返回n-1的斐波那契表示。静态内联bool is_fibrep(ulong f);//返回f是否是有效的斐波那契表示,//也就是说,它是否不包含两个相邻的。//==============标题文件src/bits/graycode.h:==========静态内联ulong灰度码(ulong x);//返回x的格雷码//(‘双向导数模2')静态内联ulong反转灰度码(ulong x);//gray_code()的逆运算//注意:返回的值包含在每个位的位置//输入的所有位的奇偶性(包括其本身)//静态内联ulong字节灰色代码(ulong x);//并行返回字节格雷码静态内联ulong字节反转灰度码(ulong x);//并行返回字节的反格雷码//====~====头文件src/bits/graypower.h:==========静态内联ulong gray_pow(ulong x,ulong e);//返回(gray_code**e)(x)//gray_pow(x,1)==灰度代码(x)//gray_pow(x,BITS_PER_LONG-1)==反转gray_code(x)静态内联ulong逆灰度波(ulong x,ulong e);//返回(反转灰色代码**(e))(x)//==(灰度代码**(-e))(x)//反转灰度波(x,1)==反转灰度码(x)//反转灰度流(x,BITS_PER_LONG-1)==灰度码(x)静态内联ulong rev_gray_pow(ulong x,ulong e);//返回(rev_gray_code**e)(x)//rev_gray_pow(x,1)==rev_grey_code(x)//rev_gray_pow(x,BITS_PER_LONG-1)==反转_rev_grey_code(x)静态内联ulong逆revgray_pow(ulong x,ulong e);//返回(反转_rev_gray_code**(e))(x)//==(rev_gray_code**(-e))(x)//反转_rev_gray_pow(x,1)==反转_rew_gray_code(x)//reverse_rev_gray_pow(x,BITS_PER_LONG-1)==rev_gray_code(x)//====~====头文件src/bits/grsnegative.h:==========静态内联ulong grs_negate_q(ulong x);//返回Golay-Rudin-Shapiro序列//(OEIS序列A020985)指数x为负值//返回x的1=// 3,6,11,12,13,15,19,22,24,25,26,30,35,38,43,44,45,47,48,49,// 50,52,53,55,59,60,61,63,67,70,75,76,77,79,83,86,88,89,90,94,// 96,97,98,100,101,103,104,105,106,110,115,118,120,121,122,// 126,131,134,139,140, ...////算法:计数模2位对//静态内联ulong grs_next(ulong k,ulong g);//使用g==grs_negate_q(k),计算grs_nemegate_q(k+1)。//====~====头文件src/bits/hilbert.h:==========//-----SRCFILE=src/bits/lin2hilbert.cc:-----空心lin2hilbert(ulong t,ulong&x,ulong&y);//将线性坐标t转换为希尔伯特x和yulong hilbert2lin(ulong x,ulong y);//将希尔伯特x和y转换为线性坐标tulong hilbert_gray代码(ulong t);//基于函数lin2hilbert()的Gray代码。//相当于以下陈述顺序://{lin2hilbert(t,x,y);//x=灰度代码(x);y=灰度代码(y);//返回位zip2(x,y);}ulong逆hilbert_gray码(ulong g);//hilbert_gray_code()的逆运算静态内联ulong-hilbertp(ulongt);//设(dx,dy)为(水平,垂直)移动//希尔伯特曲线的步长为t。//如果(dx+dy)==-1,则返回零,否则返回一(然后:(dx+dy)==+1)。//在hilbert_dir()中使用//算法:计算t的基数4展开中的三个数。静态内联ulong-hilbertm(ulongt);//设(dx,dy)为(水平,垂直)移动//希尔伯特曲线的步长为t。//如果(dx-dy)==-1,则返回零,否则返回一(then:(dx-dy)==+1)。//用于hilbert_dir()静态内联ulong-hilbert_dir(ulong t);//用希尔伯特曲线返回下一步的编码。////d\在{0,1,2,3}中如下://d:方向//0:右(+x:dx=+1,dy=0)//1:向下(-y:dx=0,dy=-1)//2:向上(+y:dx=0,dy=+1)//3:左(-x:dx=-1,dy=0)////按符号打印:cout<<(“>v^<”)[d];////dx+dy:++-+++-+++----++++-+++-+++----++++-+++-+++----+---+---+---++++-//dx-dy:+----+++-+++-+++-++++---+---+----++++---+---+----++++---+---+--//目录:>^>^>v> >^<^>^<v> >^<^>^<vv型<^^<静态内联int hilbert_turn(ulong t);//用台阶返回转弯处(左或右)//希尔伯特曲线的t和t-1。//返回值为//0表示无转弯//右转+1//-1用于左转////符号打印:cout<<(“-0+”)[u];//目录:>^>^>v> >^<^>^<v> >^<^>^<vv(可变电压)<^^<//圈数:0--+0++--++0+--0-++-0--++--0-+++-0--++--0-++-0--+0+++--//====~====头文件src/bits/ith-one-idx.h:==========静态内联ulong ith_one_idx(ulong x,ulong i);//返回x的第i个集合位的索引//其中0<=i<bit_count(x)。//====~====头文件src/bits/kolakoski-seq.h:==========kolakoski_seq类;//Oldenburger-Kolakoski序列的生成器。//见OEIS序列A00002。//参见。https://en.wikipedia.org/wiki/Kolakoski_sequence网站//David Eppstein的算法,参见// https://11011110.github.io/blog/2016/10/14/kolakoski-sequence-via.html//====~====头文件src/bits/negbin.h:==========//与基数(-2)的转换。静态内联ulong bin2neg(ulong x);//二进制-->基数(-2)//.//HAKMEM,第128项静态内联ulong-neg2bin(ulong x);//基数(-2)-->二进制//bin2neg()的逆运算静态内联ulong negbin_fixedpoint(ulong k);//返回bin2neg()的第k个不动点//当k=000000 ABCDEF(二进制)时,返回值为0A0B0C0D0E0F。静态内联ulong next_negbin(ulong x);//用x表示n的基数(-2)//返回n+1的基数(-2)表示。静态内联ulong prev_negbin(ulong x);//用x表示n的基数(-2)//返回n-1的基数(-2)表示。静态内联ulong-negbin_add(ulong a,ulong b);//基数(-2)表示中两个数字的相加。//====~====头文件src/bits/nextgray.h:==========静态内联ulong next_gray2(ulong x);//输入x==gray_code(2*k)时,返回的是gray_ccode(2*k+2)。//让x1是单词x右移一次//i1的逆格雷码。//设r1是r右移一次的返回值。//则r1=gray_code(i1+1)。//也就是说,我们有一个格雷码计数器。//参数的位数必须为偶数。////k:克(k)克(2*k)克// 0: ....... ....... ...... . ...... .// 1: ......1 .....11 .....1 1 .....+ 1// 2: .....11 ....11. ....11 . ....+1 .// 3: .....1. ....1.1 ....1. 1 ....1- 1// 4: ....11. ...11.. ...11. . ...+1. .// 5: ....111 ...1111 ...111 1 ...11+ 1// 6: ....1.1 ...1.1. ...1.1 . ...1-1 .// 7: ....1.. ...1..1 ...1.. 1 ...1.- 1// 8: ...11.. ..11... ..11.. . ..+1.. .// 9: ...11.1 ..11.11 ..11.1 1 ..11.+ 1// 10: ...1111 ..1111. ..1111 . ..11+1 .// 11: ...111. ..111.1 ..111. 1 ..111- 1// 12: ...1.1. ..1.1.. ..1.1. . ..1-1. .// 13: ...1.11 ..1.111 ..1.11 1 ..1.1+ 1// 14: ...1..1 ..1..1. ..1..1 . ..1.-1 .// 15: ...1... ..1...1 ..1... 1 ..1..- 1// 16: ..11... .11.... .11... . .+1... .// 17: ..11..1 .11..11 .11..1 1 .11..+ 1////请注意,始终随增量而变化//发生在最右边位的左边。////将任意(格雷码)字g转换为//x=(g<<1)^奇偶校验(g)//为了使用这个例程。//====~====头文件src/bits/parenwords.h:==========静态内联bool is_parenword(ulong x);//返回x是否是有效的paren单词。////二进制字<16,有效的//“paren words”标记为“P”:// .... P[空字符串]// ...1个P()// ..1// ..11点(())// .1..//.1.1 P()()// .11.//.111磅(())// 1...// 1..1// 1.1.//1.11 P(()())// 11..//11.1 P()(())// 111.//1111((()))静态内联void parenword2str(ulong x,char*str);//将与x对应的paren字符串填充到str中。////有效的二进制字<32//“paren单词”和paren字符串:// ..... [空字符串]// ....1 ()// ...11 (())// ..1.1 ()()// ..111 ((()))// .1.11 (()())// .11.1 ()(())// .1111 (((())))// 1..11 (())()// 1.1.1 ()()()// 1.111 ((()()))// 11.11 (()(()))// 111.1 ()((()))// 11111 ((((()))))//注1:单词中的低位(右端)对应//到字符串的开头(左端)。//注2:必要时,单词用零扩展(向左),//因此str的长度必须大于等于1+2*(设置位数)静态内联ulong first_parenword(ulong n);//返回对应于n对paren的最小二进制字。//例如,n=5:。。。。。11111 ((((()))))静态内联ulong last_parenword(ulong n);//返回对应于n对paren的最大二进制字。//必须具有:1<=n<=BITS_PER_LONG/2。//例如,n=5:.1.1.1.1()()(,)()静态内联ulong next_parenword(ulong x);//下一个(colex顺序)二进制字是paren字。//n=4,从first_parenword(n)开始//得到以下序列:// .....1111 (((())))// ....1.111 ((()()))// ....11.11 (()(()))// ....111.1 ()((()))// ...1..111 ((())())// ...1.1.11 (()()())// ...1.11.1 ()(()())// ...11..11 (())(())// ...11.1.1 ()()(())// ..1...111 ((()))()// ..1..1.11 (()())()// ..1..11.1 ()(())()// ..1.1..11 (())()()// ..1.1.1.1 ()()()()// ......... [零]//====~====头文件src/bits/parity.h:==========静态内联ulong字节奇偶校验(ulong x);//并行返回字节的奇偶校验静态内联ulong奇偶校验(ulong x);//如果设置位数为偶数,则返回0,否则返回1//====~====头文件src/bits/pcrc64.h:==========pcrc64类;//为输入字的每个位并行计算64位CRC。//使用的基本多项式是x^64+x^4+x^3+x^2+1//====~====头文件src/bits/print-bin.h:==========//-----SRCFILE=src/bits/print-bin.cc:-----void print_bin(const char*bla,unsigned long long x,ulong pd/*=0*/,const char*c01/*=nullptr*/);//将x打印到半径-2。//pd:要打印多少位。void print_bin_vec(const char*bla,unsigned long long x,ulong pd/*=0*/,const char*c01/*=nullptr*/);//将x打印到基数-2,最低有效位优先(作为矢量)。//pd:要打印多少位。void print_idx_seq(const char*bla,unsigned long long x,ulong off/*=0*/);//按索引顺序打印x://x=。。。。1..11 ==> [0, 1, 4]//取消偏移=0开始索引为off,而不是0。//-----SRCFILE=src/bits/print-bindiff.cc:-----void print_bin_diff(常量字符*bla,无符号long long x1,无符号长x 2,ulong pd/*=0*/,const char*c01pm/*=“.1+-”*/);//两个值x1和x2之间的二进制打印差异://x1和x2之间一致的位打印为//c01pm[0]==“.”对于零和c01pm[1]='1'对于一//x1和x2之间不同的位打印为//如果在x2中设置(即添加了位),则c01pm[2]==“+”//如果在x1中设置,c01pm[3]==“-”(即位被删除)//示例://x1==1.11.11//x2==1.111…1//等式==11.111..1//输出=“1.+11.--1”void print_bin_vec_diff(常量字符*bla,无符号long long x1,无符号长x 2,ulong pd/*=0*/,const char*c01pm/*=“.1+-”*/);//-----SRCFILE=src/bits/print-bitset.cc:-----void print_bit_set(const char*bla,ulong x,ulong-rq/*=0*/);//将给定的delta集合打印为单词x作为集合。//示例:x=[0,0,1,0,1,1]==>{0,1,3}//如果rq=0然后打印rq-bit反向二进制字的集合://示例:rq=6,x=[0,0,1,0,1,1]==>{3,1,0}//====~====头文件src/bits/radix-2i.h:==========//与基数(2*i)的转换,“四进制虚基数”。//复数需要的基数(2*i)表示//点后一位(即两位)。静态内联ulong bin_real_to_rad2i(ulong x);//二进制-->基数(2*i)静态内联ulong bin_imag_to_rad2i(ulong x);//二进制*i-->基数(2*i)静态内联ulong bin_to_rad2i(ulong re,ulong im);//二进制(re+i*im)-->基数(2*i)静态内联ulong rad2i_to_bin_real(ulong x);//基数(2*i)(必须是纯实数)-->二进制静态内联ulong rad2i_to_bin_imag(ulong x);//基数(2*)(必须是纯虚的)-->二进制静态内联void rad2i_to_bin(ulong z,ulong&re,ulong&im);//基数(2*i)-->二进制(re+i*im)静态内联布尔rad2i_is_real(ulong z);//返回z是否为纯实数。静态内联bool rad2iis_imag(ulong z);//返回z是否为纯虚数。//====~====头文件src/bits/radix-m1pi.h:==========//与(复数)基数(-1+i)的转换。静态内联ulong bin_real_to_radm1pi(ulong x);//二进制-->基数(-1+i)静态内联ulong bin_imag_to_radm1pi(ulong x);//二进制*i-->基数(-1+i)静态内联ulong add_radm1pi(ulong x,ulong y);//添加基数(-1+i)表示x和y。//注意x+(x<<1)==x+(-1+i)*x==i*x静态内联ulong bin_to_radm1pi(ulong re,ulong im);//二进制(re+i*im)-->基数(-1+i)静态内联ulong radm1pi_to_bin_real(ulong x);//将基数(-1+i)(必须是纯实数)转换为二进制。静态内联ulong radm1pi_to_bin_imag(ulong x);//将基数(-1+i)(必须是纯虚的)转换为二进制。静态内联void radm1pi_to_bin(ulong z、ulong&re、ulong&im);//基数(-1+i)-->二进制(re+i*im)静态内联布尔radm1pi_is_real(ulong z);//返回z是否为纯实数。静态内联布尔radm1pi_is_imag(ulong z);//返回z是否为纯虚数。//====~====头文件src/bits/radix-m4.h:==========//与基数(-4)的转换。静态内联ulong bin_to_radm4(ulong x);//二进制-->基数(-4)静态内联ulong radm4to_bin(ulong x);//基数(-4)-->二进制//bin_to_radm4()的倒数静态内联ulong next_radm4(ulong x);//用x表示n的基数(-4)//返回n+1的基数(-4)表示。静态内联ulong prev_radm4(ulong x);//用x表示n的基数(-4)//返回n-1的基数(-4)表示。静态内联ulong radm4_add(ulong a,ulong b);//基数(-4)表示中两个数字的相加。//====~====头文件src/bits/revbin-upd.h:==========静态内联ulong revbin_upd(ulong r,ulong h);//设n=2**ldn和h=n/2。//然后,当r==入口处的revbin(x,ldn)时,返回revbin(x+1,ldn//注意:如果用r调用all-ones单词,例程将挂起静态内联void make_revbin_upd_tab(ulong h);//初始化revbin_tupd()使用的查找表静态内联ulong revbin_tupd(ulong r,ulong k);//设r==revbin(k,ldn),然后//返回转速(k+1,ldn)。//注1:使用前需要调用make_revbin_upd_tab(ldn)//其中ldn=log2(n)//注2:与revbin_upd()不同的参数结构//====~====头文件src/bits/revbin.h:==========静态内联ulong bswap(ulong x);//返回字节顺序颠倒的单词。静态内联ulong revbin(ulong x);//以相反的位顺序返回x。静态内联ulong revbin_t(ulong x);//以相反的位顺序返回x。//基于表的版本。静态内联ulong revbin_t_le32(ulong x);//以相反的位顺序返回x。//长度小于或等于32位的基于表格的版本。静态内联ulong revbin_t_le16(ulong x);//以相反的位顺序返回x。//长度小于或等于16位的基于表格的版本。静态内联ulong-xrevbin(ulong a,ulong-x);//revbin的象征力量。静态联机ulong转速箱(ulong x,ulong ldn);//带有ldn最低有效位的返回字//x的(即位0…位{ldn-1})被反转,//其他位设置为零。//======头文件src/bits/revgraycode.h:==========静态内联ulong rev_gray_code(ulong x);//返回x的反转格雷码。//(“向高位取2的位向导数”)。//另外:用x+1作为二元多项式进行乘法。//另外:以二进制正态基返回x^2+x。//rev_gray_code(x)==revbin(灰色代码(revbin(x)))静态内联ulong逆revgray码(ulong x);//rev_gray_code()的反转//注:返回值在每个位位置包含奇偶校验//从它(包括它本身)输入的所有位。//此外:除以x+1作为GF(2)的幂级数//另外:以二进制正态基返回z=x^2+x的解。//注:这些语句可以随意重新排序。//反转灰度码(x)==revbin(反转灰度码)//====~====头文件src/bits/tcrc64.h:==========tcrc64类;//64位CRC(循环冗余校验),带查找表//====~====头文件src/bits/thue-morse.h:==========thue_morse类;//Thue-Morse序列//====~====头文件src/bits/tinyfactors.h:==========静态内联bool是tinyprime(ulong n);//对于n<BITS_PER_LONG(!)//返回n是否为素数静态内联bool is_tiny_factor(ulong x,ulong d);//对于x,d<BITS_PER_LONG(!)//返回d是否除以x(1和x被包括为除数)//无需检查d==0////======头文件src/bits/zerobyte.h:==========静态内联ulong包含零字节(ulong x);//确定x的任何子字节是否为零://当x不包含零字节时返回零,当x包含非零字节时则返回非零。////要扫描除零以外的其他值(例如0xa5),请使用://包含_零字节(x^0xa5a5a5UL)//======头文件src/bits/zorder.h:==========//Z阶(或莫顿阶),非自相交的空间填充曲线。静态内联void zorder_next(ulong&x,ulong&y);静态内联void zorder_prev(ulong&x,ulong&y);静态内联void zorder3dnext(ulong&x、ulong&y、ulong&z);静态内联void zorder3dprev(ulong&x,ulong&y,ulong-z);