【问题标题】:How to get Gray-Code from Decimal number [duplicate]如何从十进制数中获取格雷码[重复]
【发布时间】:2011-03-21 02:34:52
【问题描述】:

可能重复:
Gray code in .NET

我想从等效的十进制中获取数字的格雷码。

示例:

Dec  Gray   Binary
 0   000    000
 1   001    001
 2   011    010
 3   010    011
 4   110    100
 5   111    101
 6   101    110
 7   100    111

【问题讨论】:

  • google 第一页用 C# 提出一大堆解决方案

标签: c# .net numbers gray-code


【解决方案1】:

假设您只想对非负整数执行此操作:

static uint BinaryToGray(uint num)
{
    return (num>>1) ^ num;
}

您可能还想阅读this blog post,它提供了双向转换的方法,尽管作者选择将代码表示为int 的数组,每个位置包含一个或零。我个人认为BitArray 可能是更好的选择。

【讨论】:

  • 该方法不应该被称为 PositiveIntegerToGray 还是我遗漏了什么?谢谢。
  • @csetzkorn,随便你怎么称呼它。
【解决方案2】:

MSB 保持不变。对于其余的位,您右移一位并进行异或。如果你做一个逻辑右移,所以你知道移入 MSB 的位是 0,那么你可以移位和异或。

【讨论】:

    【解决方案3】:
    #include<iostream.h>
    #include<conio.h>
    int deci,bits=0,deci_x3,bits_x3;
    int array[100][20];
    int array1[100][20];
    int array2[100][20];
    void binary(int [100][20],int,int,int);
    void gray(int);
    void display(int);
    int find_bits(int);
    
    void main()
    {
    textcolor(GREEN);
    textbackground(BLUE);
    clrscr();
    cout<<"Enter the no. upto which gray code and excess 3 code is to be
    generated : ";
    cin>>deci;
    bits=find_bits(deci);
    deci_x3=deci+3;
    bits_x3=find_bits(deci_x3);
    for(int i2=0;i2<=deci;i2++)
    {
    for(int j2=0;j2<=bits;j2++)
    {
    array[i2][j2]=0;
    array1[i2][j2]=0;
    }
    }
    array2[0][bits_x3-1]=1;
    array2[0][bits_x3-2]=1;
    for( i2=1;i2<=deci_x3;i2++)
    {
    for(int j2=0;j2<=bits_x3;j2++)
    {
    array2[i2][j2]=0;
    }
    }
    cout<<" DECI NO. BINARY EQ. GRAY CODE EXCESS 3";
    cout<<endl<<"-------------------------------------------------------------
    --";
    display(0);
    getch();
    for(int i=1;i<=deci;i++)
    {
    binary(array,i,bits,0);
    gray(i);
    binary(array2,i,bits_x3,1);
    display(i);
    getch();
    }
    }
    
    void binary(int array_bin[20][20],int i,int bits2,int flag)
    {
    int ix;
    if(flag==1)
    ix=i+3;
    else
    ix=i;
    array_bin[i][bits2-1]=(array_bin[i-1][bits2-1]==0?1:0);
    for(int k1=2,i1=2;k1<=bits2;k1++,i1*=2)
    {
    if((ix/i1)%2==0)
    array_bin[i][bits2-k1]=0;
    else
    array_bin[i][bits2-k1]=1;
    }
    }
    
    
    
    void gray(int i)
    {
    //FIXING THE HIGHEST ORDER BIT FIRST
    array1[i][0]=array[i][0];
    for(int j=1;j<bits;j++)
    {
    if((array[i][j-1]==0&&array[i][j]==0)||(array[i][j-1]==1&&array[i][j]==1))
    array1[i][j]=0;
    else
    array1[i][j]=1;
    }
    }
    
    void display(int m)
    {
    cout<<endl;
    if(m<=9)
    cout<<" "<<m<<" " ;
    else
    cout<<" "<<m<<" " ;
    for(int j=0;j<bits;j++)
    cout<<array[m][j];
    cout<<" " ;
    for( j=0;j<bits;j++)
    cout<<array1[m][j];
    cout<<" ";
    for( j=0;j<bits_x3;j++)
    cout<<array2[m][j];
    }
    
    
    
    int find_bits(int m)
    {
    int k,bits1=0;
    do
    {
    bits1++;
    k=1;
    for(int i=1;i<=bits1;i++)
    k=k*2;
    }
    while(k<=m);
    return(bits1);
    }
    

    【讨论】:

    • 这是什么?目前尚不清楚这堵 Turbo C 代码的用途。
    • 它是一个用 C 语言编写的程序,用于转换为二进制和格雷码格式。
    • 在 Turbo C 上大笑 - @Coding-Freak:OP 要求 C# 而不是 C
    • 哎呀。一个大错误。对不起。但问题中没有具体说明。
    • Freak:再次检查 - 每个问题下方都有标签,指定问题的相关内容。
    猜你喜欢
    • 2016-03-05
    • 2015-05-04
    • 1970-01-01
    • 2023-03-11
    • 2019-03-29
    • 2023-03-15
    • 1970-01-01
    • 2011-07-12
    • 2021-02-21
    相关资源
    最近更新 更多