/**
*参考一下用吧,汇编难找啊
* 二进制转换成格雷码
* @param lStart lvalue所在区间下界
* @param lEnd lvalue所在区间上界
* @param lvalue 要转换的二进制数的实值
* @return 返回格雷码对应的二进制数的实值
* @see g2b() g2b 格雷码转换二进制
* @see BtoG() BtoG 二进制转换格雷码
* @see GtoB() BtoG 格雷码转换二进制
* @author 黄毅
* @useage a=b2g(0,15,4); //取得4所对应格雷码的二进制值 结果a等于6
* @memo lvalue的值必须在区间[lStart,lEnd]里,否则无法求得所求结果.相应地,如果区间越小,求得结
* 果所用的时间就越少.而且lStart,lEnd的值必须为2的N次方减1. 通常lStart为0.为了方便求得
* 其值,建议使用BtoG()函数来进行操作.不过这样会使计算时间加长到原来的120%~180%.
*/
unsigned long b2g(unsigned long lStart,unsigned long lEnd,unsigned long lvalue)
{
unsigned long Start=lStart,End=lEnd,Temp=0,Counter=0;
bool Type=true;
while(Start <End)
{
Temp=(End+Start-1)> > 1;
if (lvalue <=Temp)
{
if(!Type)
Counter+=((End-Start+1)> > 1);
End=Temp;
Type=true;
}
else
{
if(Type)
Counter+=((End-Start+1)> > 1);
Start=++Temp;
Type=false;
}
}
return Counter;
}
/**
* 格雷码转换成二进制
* @param lStart lvalue对应二进制数所在区间下界
* @param lEnd lvalue对应二进制数所在区间上界
* @param lvalue 要转换的格雷码的实值
* @return 返回二进制数对应的格雷码的实值
* @see b2g() b2g 二进制转换格雷码
* @see BtoG() BtoG 二进制转换格雷码
* @see GtoB() BtoG 格雷码转换二进制
* @author 黄毅
* @useage a=b2g(0,15,6); //取得6所对应二进制值的格雷码 结果a等于4
* @memo lvalue对应二进制数的值必须在区间[lStart,lEnd]里,否则无法求得所求结果.相应地,如果区
* 间越小,求得结果所用的时间就越少.而且lStart,lEnd的值必须为2的N次方减1. 通常lStart为0.
* 为了方便求得其值,建议使用GtoB()函数来进行操作.但会使计算时间加长到原来的105%~140%.
*/
unsigned long g2b(unsigned long lStart,unsigned long lEnd,unsigned long lvalue)
{
unsigned long Start=lStart,End=lEnd,Counter=0,Temp=0;
bool Type=true;
while(Start <End)
{
Temp=Counter+((End-Start+1)> > 1);
if(Type^(lvalue <Temp))
{
if(Type) Counter=Temp;
Start=(Start+End+1)> > 1;
Type=false;
}
else
{
if(!Type) Counter=Temp;
End=(Start+End-1)> > 1;
Type=true;
}
}
return Start;
}
//b2g外壳程序,用来算lStart,lEnd;
long BtoG(unsigned long lvalue)
{
register unsigned long lV=lvalue,lMax=1;
while (lV> 0)
{
lV> > =1;
lMax < <=1;
}
if (lMax==0) return -1;
return b2g(0,--lMax,lvalue);
}
//g2b外壳程序
long GtoB(unsigned long lvalue)
{
register unsigned long lV=lvalue,lMax=1;
while (lV> 0)
{
lV> > =1;
lMax < <=1;
}
if (lMax==0) return -1;
return g2b(0,--lMax,lvalue);
}
main()
{
long input=0;
#ifdef test
//程序测试部分
clock_t cStart,cEnd;
unsigned long dTime;
cStart=clock();
for (input=0;input <9999999;input++)
BtoG(32768);
cEnd=clock();
dTime=(cEnd-cStart);
printf("BtoG: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
//------------------------------------------------------
cStart=clock();
for (input=0;input <9999999;input++)
b2g(0,65535,32768);
cEnd=clock();
dTime=(cEnd-cStart);
printf("b2g: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
//------------------------------------------------------
cStart=clock();
for (input=0;input <9999999;input++)
GtoB(32768);
cEnd=clock();
dTime=(cEnd-cStart);
printf("GtoB: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
//------------------------------------------------------
cStart=clock();
for (input=0;input <9999999;input++)
g2b(0,65535,32768);
cEnd=clock();
dTime=(cEnd-cStart);
printf("g2b: %ld / %ld\n",dTime,CLOCKS_PER_SEC);
#else
//程序演试部分
printf("Input(HEX):");
scanf("%x",&input);
while (input!=-1)
{
printf("------BtoG------\nBinary:%08Xh\nGray :%08Xh\n------GtoB------\nGray :%08Xh\nBinary:%08Xh\n----------------\n",input,BtoG(input),input,GtoB(input));
printf("Input(HEX):");
scanf("%x",&input);
}
#endif
}