导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→ASM的没有,你看这行吗?

* 58252: 拜求格雷码转换二进制的汇编程序

   zglike 
zglike发表的帖子 

 ASM的没有,你看这行吗?
*/
 
//#define test
#include   <stdio.h>  
#ifdef test
 #include   <time.h>  
#endif

/**
 *参考一下用吧,汇编难找啊
 * 二进制转换成格雷码
 * @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
}


发表时间:2004年7月15日21:50:17

  
回复该帖

本主题共有 3 帖,分页:>>>>>该主题的所有内容[3]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  58367.[详细]格雷码到二进制的转换符合一个公式运算,具体的我忘了,你找找看
摘要:......(无内容)
- [cuittao][1223次] 2004年7月17日

[上一篇帖子]:谢谢大家各位前辈好:       
[下一篇帖子]:老大,我现在正在琢磨CPLD呢,能不能给我发一份过来? /P P benjaminc@163.c