如何将一个负二进制数转换为其格雷码

4

我有一个带有符号位的负二进制数,想编写程序获取它的格雷码。然而,我只能找到正数的解决方案。所以我在这里提出了这个问题。 谢谢。


你希望负数代码看起来像什么? 只是将您的数字视为无符号将至少给出一些内容(也就是说,您可以转换为格雷码,然后再转换回来,这样您就有原始数字了)。 - harold
2个回答

0

格雷码只能用以下方法计算非负数:

int gray_encode(int n) {
    return n ^ (n >> 1);
}

同样的方法对于负数不起作用,因为二进制数的补码表示。


我需要证明来回答这个问题吗? - syntagma
我的意思是整个二进制补码的处理方式意味着大正数和负数之间没有区别,所以如果有什么的话,你已经证明它是可能的。 - harold

0

如果目标位宽已知,则可以将有符号整数转换为格雷码:

int gray_encode(int n) {
    return n ^ (n >> 1);
}

int gray_encode_signed(int n, int width_bits) {
    int all_ones = (1 << width_bits) - 1;
    return (n >= 0 ? gray_encode(n) : gray_encode(abs(n)) + all_ones);
}

例如,这是从-7到7的值的4位格雷码:
decimal   4bit gray code
     -7    1011
     -6    1100
     -5    1110
     -4    1101
     -3    1001
     -2    1010
     -1    1000
      0    0000
      1    0001
      2    0011
      3    0010
      4    0110
      5    0111
      6    0101
      7    0100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接