Как преобразовать отрицательное двоичное число в его серый код

У меня есть отрицательное двоичное число, у которого есть знаковый бит, и я хочу написать программу, чтобы получить ее серый код. Однако я могу найти решение только для положительного числа. Поэтому здесь я задаю этот вопрос. Благодарю.

2 ответа

Код Грея можно рассчитать только для неотрицательных чисел, используя следующий метод:

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

Тот же метод не будет работать для отрицательных чисел из-за представления двоичных чисел в дополнении Two.

Можно преобразовать целое число со знаком в код Грея, если известна целевая разрядность:

      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);
}

Например, это 4-битный код Грея для значений от -7 до 7:

      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
Другие вопросы по тегам