二元右移,只有加法

时间:2011-03-31 11:02:19

标签: assembly binary logic lc3

我正在开发一个项目,我正在读取内存位置,需要以ASCII格式输出其十六进制值。

这种语言给了我一个16位的字长,所以我需要分一次抓取一个半字节来转换为十六进制。不幸的是,该语言仅提供和/或不提供数学/逻辑功能。

我认为我可以通过左移和测试负标志来创建所需的效果,以便在移位后将1添加到结尾,但我认为必须有更好的方法来执行此操作。

任何见解都将受到赞赏。

4 个答案:

答案 0 :(得分:0)

使用AND可以将所有位设置为零,除了最后一个重要的半字节:

0101010111010101
0000000000001111 AND
----------------
0000000000000101

通过改变整个事物,你可以阅读下一个半字节:

0101010111010101 SHR 4
----------------
    010101011101
0000000000001111 AND
----------------
0000000000001101

对你有用吗?

答案 1 :(得分:0)

你有附带的附件吗?而不是负面的测试添加位结束并添加零与进位将其重新放回右侧。并没有真正节省多少。到目前为止,我无法想到另一个解决方案,向左移动,测试一下,如果设置为1添加东西并转移那些东西:

uint a,b,i;

b=0;
for(i=0;i<4;i++)
{
   b=b+b;
   if(a&0x8000) b+=1;
   a=a+a;
}

如果上面的uint是16位,那么上面会给你一个12的右移。在编写b的过程中会被破坏,如同所写。

答案 2 :(得分:0)

你可以反过来试试:你可以使用蛮力,而不是试图实现正确的转变。以下是最高半字节的示例:

unsigned rez, tmp;
for (rez = 0, tmp = some_word & 0x0FFF; tmp != some_word; rez++, tmp += 0x1000);

答案 3 :(得分:0)

所以我使用的原始方法有效。我也提出了另一个,因为任何人都有这个问题。

我构建了一个子程序,一次评估4位并根据评估创建一个数字,对于某些C样式的伪代码,它看起来像这样:

16bitSignedInt bin; //binary being analyzed
int value; //number being built

for (int i = 0; i < 4; i++) // while 0-3, for each nibble of the 16 bits
{
   if (bin.bit15 = 1)
      value += 8; // dominate bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 4; // 2nd bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 2; // 3rd bit in nibble

   bin <<= 1; // left shift 1

   if (bin.bit15 = 1)
      value += 1; // last bit in nibble

   bin <<= 1; // left shift 1

   //do work with value
}

原油,但有效。