#如果!定义的HAVE_BIT2POW_H__#定义HAVE_BIT2POW_H__//此文件是FXT库的一部分。//版权所有(C)20102012 Joerg Arndt//许可证:GNU通用公共许可证版本3或更高版本,//请参阅主目录中的文件COPYING.txt。#包括“fxttypes.h”#包括“bits/bitsperlong.h”#包括“bits/bithigh.h”#包括“bits/bitasm.h”静态内联ulong ld(ulong x)//返回楼层(log2(x)),//即返回k,使2^k<=x<2^(k+1)//如果x==0,则返回0(!){//ulong k=0;//而(x>>=1){++k;}//返回k;#如果定义了BITS_USE_ASM返回asm_bsr(x);#其他返回最高值one_idx(x);#endif//BITS_USE_ASM}// -------------------------//静态内联int ild(ulong x)////版本返回类型int//{//返回(int)ld(x);//}//// -------------------------//静态内联无符号long-long ld(无符号long x)////返回k,使2^k<=x<2^(k+1)////如果x==0,则返回0(!)//{//#如果BITS_PER_LONG==64//返回最高值one_idx(x);//#其他//ulong r=最高one_idx(x>>32);//如果(r)返回r+32;//否则返回最高的one_idx(x);//#结尾//}//// -------------------------静态内联bool is_powof2(ulong x)//返回x==0(!)或x==2**k{返回!(x&(x-1));//返回((x&-x)==x);}// -------------------------静态内联bool one_bit_q(ulong x)//返回x\在{1,2,4,8,16,…}中{ulong m=x-1;return(((x^m)>>1)==m);}// -------------------------静态内联ulong nextpowof2(ulong x)//如果x=2**k,则返回x//否则返回2**cel(log_2(x))//异常:x==0时返回0{如果(is_pow_of_2(x))返回x;#如果定义了BITS_USE_ASMulong n=1UL<> 1;x|=x>>2;x|=x>>4;x|=x>>8;x |=x>>16;#如果BITS_PER_LONG==64x|=x>>32;#结束语返回x+1;#结束语}// -------------------------//静态内联ulong next_expof2(ulong x)////如果x=2**k,则返回k,否则返回k+1。////异常:x==0时返回1//{//ulong ldx=ld(x);//ulong n=1UL<-->