gpt4 book ai didi

用于生成下一位以翻转格雷码的 C 代码

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:36 24 4
gpt4 key购买 nike

我需要一个返回数字的函数,它基本上告诉我移动到格雷码的第 n 个元素时要翻转的位。它是标准(反射)格雷码还是其他一些最小的位切换方法并不重要。我可以做到,但它似乎不必要地笨拙。目前我有这个:

#include <stdio.h>

int main()
{
int i;
for (i=1; i<32; i++)
printf("%d\n",grayBitToFlip(i));
}


int grayBitToFlip(int n)
{
int j, d, n1, n2;

n1 = (n-1)^((n-1)>>1);
n2 = n^(n>>1);
d = n1^n2;
j = 0;
while (d >>= 1)
j++;
return j;
}

main() 中的循环只是为了演示函数的输出。

有没有更好的办法?

编辑:只看输出,很明显可以更简单地做到这一点。我添加了第二个函数 gray2,它可以更简单地完成同样的事情。这是这样做的方法吗?顺便说一句,这不是生产代码,而是爱好者。

#include <stdio.h>

int main()
{
int i;
for (i=1; i<32; i++)
printf("%d %d\n",grayBitToFlip(i), gray2(i));
}


int grayBitToFlip(int n)
{
int j, d, n1, n2;

n1 = (n-1)^((n-1)>>1);
n2 = n^(n>>1);
d = n1^n2;
j = 0;
while (d >>= 1)
j++;
return j;
}

int gray2(int n)
{
int j;
j=0;
while (n)
{
if (n & 1)
return j;
n >>= 1;
j++;
}
return j;
}

最佳答案

最容易使用的格雷码是约翰逊格雷码 (JGC)。

BitNumberToFlip = ++BitNumberToFlip  % NumberOfBitsInCode;

JGC = JGC ^ (1 << BitNumberToFlip); // start JGC = 0;

约翰逊码在表示所需的位数方面是线性的。
二进制反射格雷码 (BRGC) 具有更好的位密度,因为只有需要对数位来表示 BRGC 代码的范围。

int powerOf2(int n){ return          //   does 16 bit codes
( n & 0xFF00 ? 8:0 ) + // 88888888........
( n & 0xF0F0 ? 4:0 ) + // 4444....4444....
( n & 0xCCCC ? 2:0 ) + // 22..22..22..22..
( n & 0xAAAA ? 1:0 ) ; } // 1.1.1.1.1.1.1.1.
// much faster algorithms exist see ref.

int BRGC(int gc){ return (gc ^ gc>>1);}

int bitToFlip(int n){ return powerOf2( BRGC( n ) ^ BRGC( n+1 ) ); }

详情见引用:
How do I find next bit to change in a Gray code in constant time?

关于用于生成下一位以翻转格雷码的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34236332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com