我正在进行分配,我将在二进制文件中输入,并将其反向存储在另一个地址中。我正在使用4位字,直到我能够将逻辑降低,然后在一切正常工作后将其扩展为16位字。
例如:1010100101001011 ==> 1101001010010101
到目前为止,这是我的方法:
字:1010 面具:0001 结果:0000
1)1010& 0001 - 和这一起
result is: 0000
(我希望只能将最低有效位存储为我的结果中最重要的位置)
2)1010& 0010 - 增加我的面具,并将它与我的单词“和”结合起来
结果是:0010
现在我会把这个位置放在2位,然后将它存储在我的结果寄存器的4位。
这就是我遇到的问题,试图找出隔离一位然后将其存储在另一个位置的逻辑。
任何提示或建议将不胜感激。
答案 0 :(得分:0)
假设你的意思是最小的LC-3,它没有移位或除法指令:
这是一个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网站有很多有趣的方法可以解决这个问题和其他比特级问题。
答案 1 :(得分: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
将上述循环转换为LC3应该是相当简单的,尽管在给定非常有限的指令集的情况下,合成|
,<<
和>>
可能具有挑战性。