1

我正在处理任务,我将以二进制形式输入,并将其反向存储在另一个地址中。我正在使用一个 4 位字,直到我能够降低逻辑,然后一旦一切正常,就可以将其扩展为 16 位字。

例如:1010100101001011 ==> 1101001010010101

到目前为止,这是我的方法:

字:1010 掩码:0001 结果:0000

1) 1010 & 0001 - 和这个一起

 result is: 0000 

(我希望只能将最低有效位存储为我的结果中的最高有效位)

2) 1010 & 0010 - 增加我的掩码,并将它与我的单词进行 ANDing

结果是:0010

现在我将把位放在 2 的位置,并将其存储在我的结果寄存器中的 4 的位置。

这就是我在尝试提出逻辑来隔离一位然后将其存储在另一个位置时遇到的问题。

任何提示或建议将不胜感激。

4

2 回答 2

0

假设您的意思是最小的 LC-3,它没有移位或除法指令:

  • ADD 可用于向左移动掩码
  • ADD 可用于将结果左移
  • 您可以测试掩码和输入的 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网站有很多有趣的方法来解决这个和其他位级别的问题

于 2012-10-28T22:17:13.857 回答
0

以下是 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 应该相当简单,尽管综合起来可能|具有挑战性,因为指令集非常有限。<<>>

于 2012-10-28T22:17:27.040 回答