Преобразование двоичного кода в серый - PullRequest
1 голос
/ 15 марта 2011

Поэтому я пытаюсь написать функцию, которая преобразует 7-битный код Грея в соответствующий 7-битный двоичный код.

Вот как конвертировать -

  • Серые биты значения ---- MS бит> (G6) G5 G4 G3 G2 G1 G0 *
  • Биты двоичного значения - бит MS> (B6) B5 B4 B3 B2 B1 B0 *

  • B6 = G6 // MS биты всегда одинаковы

  • B5 = B6 ^ G5 // Исключительно ИЛИ биты вместе для создания 7-битного двоичного значения
  • B4 = B5 ^ G4
  • B3 = B4 ^ G3
  • B2 = B3 ^ G2
  • B1 = B2 ^ G1
  • B0 = B1 ^ G0

и вот моя функция до сих пор -

unsigned short Gray_to_Bin(unsigned short Gray)
{
unsigned short Bin;
unsigned short i;
unsigned short mask;

mask = 0x40; // Initial mask
Bin = 0;

Gray &= 0x7f; // Mask bit 7 (Index Bit)
Bin = Gray & mask; // Set B6 = G6

for (i=0; i<6; i++) // Set B5, B4, ..., B0
{

// Code needed here!!

}
return Bin;
}

Мне нужно найти способ доступа к необходимым конкретным битам для каждого запуска цикла ... нужно получить доступ к битам, как я мог бы с массивами как-то ...

Есть идеи / указатели? Спасибо:)

Ответы [ 5 ]

2 голосов
/ 15 марта 2011

Следующее реализует побитовую сборку результата в соответствии с заданным вами требованием.

  • B6 = G6 // MS биты всегда одинаковы
  • B5 = B6 ^ G5
  • ...

Для B5 я просто сдвигаю бит на значение B6 на один бит вправо, чтобы он соответствовал серому биту G5, затем XOR затем отфильтровывает остальные биты с помощью операции &. Эти побитовые результаты OR для создания общего результата. Повторите для последовательных битов. Для этого даже не стоит иметь цикл ... просто дополнительные возможные издержки времени выполнения и сложность исходного кода.

unsigned short gray_to_binary(unsigned short gray)
{
    unsigned short result = gray & 64;
    result |= (gray ^ (result >> 1)) & 32;
    result |= (gray ^ (result >> 1)) & 16;
    result |= (gray ^ (result >> 1)) & 8;
    result |= (gray ^ (result >> 1)) & 4;
    result |= (gray ^ (result >> 1)) & 2;
    result |= (gray ^ (result >> 1)) & 1;
    return result;
}
0 голосов
/ 15 марта 2011

Почти для любого преобразования одного семибитного кода в другой, самое простое решение - это просто таблица, например: статический символ без знака fromGray [] = { 0x00, 0x01, 0x03, 0x02, 0x06, 0x07, 0x05, 0x04, 0x0C, 0x0D, 0x0F, 0x0E, 0x0A, 0x0B, 0x09, 0x08, 0x18, 0x18, 0x1B, 0x1A, 0x1E, 0x1F, 0x1D, 0x1C, 0x14, 0x15, 0x17, 0x16, 0x12, 0x13, 0x11, 0x10, // .... }; * * Тысяча одна

В какой-то момент между 8 и 16 битами вы, вероятно, захотите перейти на алгоритмический подход (хотя с учетом памяти доступный на современных процессорах, настольный подход действителен для довольно большие столы). Даже тогда, я бы, вероятно, использовал таблицу для младшие биты.

0 голосов
/ 15 марта 2011

Следующий код должен помочь:

for (int i = 0; i < 6; ++ i) {
    unsigned short j = 5 - i;
    unsigned short m = 1 << j;
    Bin |= ((Bin >> 1) & m) ^ (Gray & m);
}
0 голосов
/ 15 марта 2011

Я думаю, это должно выглядеть примерно так:

for(i=5; i >= 0; i--){
    Bin = Bin | ((Gray & 1<<i)>>i ^ (Bin & 1<<(i + 1))>>i)<<i;
}

Чтобы получить доступ к определенному биту, вы используете 1<<i для сдвига влево на «1» i раз, получая число, равное нулю, кромеодин на i-м месте справа.Это может быть AND и Grey или Bin, обнуляя все биты, кроме того, который нам нужен.Затем результат сдвигается вправо с помощью >>i, перемещая интересующий нас бит в крайнее правое положение.Мы используем ^, чтобы xor два бита, затем сместим его влево, где принадлежит результирующий бит, и ИЛИ он вставляет Bin.

Это дает очень полезное объяснение.

0 голосов
/ 15 марта 2011

в чем проблема только с тем, что вы написали в своем вопросе, я имею в виду утверждение, которое вы можете написать B[i] = B[i+1]^G[i]; вам просто нужно поменять его, чтобы оно переходило от 4 к нулю

...