#如果!定义的HAVE_NEGBIN_H__#定义HAVE_NEGBIN_H__//此文件是FXT库的一部分。//版权所有(C)2010、2011、2012 Joerg Arndt//许可证:GNU通用公共许可证版本3或更高版本,//请参阅主目录中的文件COPYING.txt。#包括“bits/bitzip.h”//bit_zip0()#包括“fxttypes.h”#包括“bits/bitsperlong.h”//:与基数(-2)的转换。静态内联ulong bin2neg(ulong x)//二进制-->基数(-2)//.//HAKMEM,第128项{#如果BITS_PER_LONG>=64//基数2中的掩码是。。。10101010constulong m=0xaaaaaaaaaaaaaaaaUL;#其他常数m=0xaaaaaaaaUL;#结尾x+=米;x ^=米;返回x;}// -------------------------静态内联ulong neg2bin(ulong x)//基数(-2)-->二进制//bin2neg()的逆运算{#如果BITS_PER_LONG>=64constulong m=0xaaaaaaaaaaaaaaaaUL;#其他常数m=0xaaaaaaaaUL;#结尾x ^=米;x-=米;返回x;}// -------------------------静态内联ulong negbin_fixed_point(ulong k)//返回bin2neg()的第k个不动点//当k=000000 ABCDEF(二进制)时,返回值为0A0B0C0D0E0F。{#如果1返回位_zip0(k);#其他ulong f=0;对于(ulong m=1,s=0;m!=0;m<<=1,++s)f^=((k&m)<= 64constulong m=0xaaaaaaaaaaaaaaaaUL;#其他const ulong m=0xaaaaaaaUL;#结尾x ^=米;++x;x ^=米;返回x;#else//版本2:ulong s=x<<1;ulong y=x^s;y+=1;s ^=y;返回s;//版本3:使用掩码0x5555和减量#endif//版本}// -------------------------静态内联ulong prev_negbin(ulong x)//用x表示n的基数(-2)//返回n-1的基数(-2)表示。{#如果1//版本1:#如果BITS_PER_LONG>=64constulong m=0xaaaaaaaaaaaaaaaaUL;#其他const ulong m=0xaaaaaaaUL;#结尾x ^=米;--x;x ^=米;返回x;#else//版本2:#如果BITS_PER_LONG>=64常数m=0x5555555555 5555555UL;#其他常数m=0x5555555UL;#结尾x^=米;++x;x ^=米;返回x;#endif//版本}// -------------------------静态内联ulong-negbin_add(ulong a,ulong b)//基数(-2)表示中两个数字的相加。{#如果1#如果BITS_PER_LONG>=64constulong m=0xaaaaaaaaaaaaaaaaUL;#其他常数m=0xaaaaaaaaUL;#结尾#如果1a ^=m;b^=米;ulong t=a+b;t-=米;t^=米;返回t;#结尾#如果为0a ^=m;b^=米;a-=米;b-=米;ulong t=a+b;t+=米;t^=米;返回t;#结尾#其他返回bin2neg(neg2bin(a)+neg2pin(b));#结尾}//-------------------------#endif//!定义的HAVE_NEGBIN_H__