16-битное обращение слов с использованием LC-3

Я работаю над заданием, в котором я буду принимать входные данные в двоичном виде и буду хранить обратную сторону в другом адресе. Я работаю с 4-битным словом, пока не смогу разобраться в логике, а затем смогу развернуть его до 16-битного слова, как только все заработает.

Например: 1010100101001011 ==> 1101001010010101

Вот моя методология до сих пор:

слово: 1010 маска: 0001 результат: 0000

1) 1010 и 0001 - И это вместе

 result is: 0000 

(Я хочу сохранить только младший значащий бит как самый значимый в моем результате)

2) 1010 и 0010 - увеличил мою маску и добавил ее вместе со своим словом

результат: 0010

теперь я бы взял бит на 2-м месте и сохранил его на 4-м месте в моем регистре результатов.

Вот где у меня возникают проблемы при попытке придумать логику, чтобы изолировать один бит, а затем сохранить его в другом месте.

Любые советы или рекомендации будут с благодарностью.

2 ответа

Вот логика в C для наивной (но простой для понимания) реализации инверсии битов 16-битного слова:

uint16_t w = 0xb2e3;         // our 16 bit word
uint16_t mask0 = 0x0001;     // mask for LS bit
uint16_t mask1 = 0x8000;     // mask for MS bit
uint16_t shift = 15;         // distance between high and low bit positions

for (int b = 0; b < 8; ++b)  // for each pair of low/high bits
{
    uint16_t b0 = w & mask0; // get low bit
    uint16_t b1 = w & mask1; // get high bit
    w &= ~(mask0 | mask1);   // clear low/high bit in word
    b0 <<= shift;            // swap bit positions
    b1 >>= shift;
    w |= (b0 | b1);          // insert swapped bits back into word
    mask0 <<= 1;             // update masks for next pair of bits
    mask1 >>= 1;
    shift -= 2;              // update distance for next pair of bits 
}

printf("%#x\n", w);          // w should now contain 0xc74d

Тестовый код: http://ideone.com/GgbzHw

Должно быть достаточно просто перевести вышеуказанную петлю в LC3, хотя синтезировать |, << а также >> может быть сложным, учитывая очень ограниченный набор инструкций.

Предполагая, что вы имеете в виду минимальный LC-3, в котором нет инструкции сдвига или деления:

  • ДОБАВИТЬ можно использовать для смещения маски влево
  • ДОБАВИТЬ можно использовать для смещения результата влево
  • Вы можете проверить, является ли AND маски и ввода нулевым или нет
  • используйте результат теста, чтобы ДОБАВИТЬ 0 или 1 к результату после его сдвига влево

Здесь представление C

uint16_t reverse16 (uint16_t input)
{
    uint16_t result = 0u;
    uint16_t mask = 1u;
    int i;

    for (i= 0; i < 16; i++)
    {
        result = result + result;
        if (0u != (input & mask))
        {
            result += 1u;
        }
        mask = mask + mask;
    }
    return result;
}

На сайте bithacks есть много интересных подходов к решению этой и других проблем на битовом уровне.

Другие вопросы по тегам