【问题标题】:How do I print a specific bit of a number?如何打印数字的特定位?
【发布时间】:2014-12-02 01:22:59
【问题描述】:

我正在为这个问题苦苦挣扎:

提示用户输入数字,以 16 位二进制补码形式打印数字

要打印数字,您会将每个位打印为字符串“1” 或字符串“0”,使用将在每个中打印一位的循环 迭代。从第 15 位开始打印。(回想一下,我们对位进行了编号 从低位的 0 开始。)在您的循环测试位 15 中,以及 然后打印“1”或“0”。使用移位指令获取下一个 在重复之前位到第 15 位。

很遗憾,我错过了一个关于轮班和使用口罩的讲座,所以我对如何开展这个实验室并不太了解。如何打印数字的特定位?我知道我只是继续打印第 15 位,然后左移,但我不知道这会在 MIPS 中完成。任何帮助将不胜感激。

编辑:

我完全理解这种转变,它只是打印出让我感到困惑的部分。

例如,如果我想转换为二进制补码的数字是 25,并且在寄存器 $t0 中。

首先我打印第 15 位。然后我左移。然后我重复 15 次。

它应该看起来像这样:

# Print bit
sll     $t0, $t0, 1

我只是不明白如何在第 15 点打印第一位。

【问题讨论】:

  • 在 ascii 中,字符“0”用值 0x30 表示,而“1”则用 0x31 表示。因此,如果您要进行数字右移 N 位,然后使用 1,您将得到 0 或 1 是吗?然后添加 or 或 0x30 你得到 0x30 或 0x31 是吗?对 N 的每个值重复...

标签: mips twos-complement 16-bit


【解决方案1】:

分解问题—— 1.如何打印位,以及 2.如何确定bit的值

您已经知道如何确定位的值,您测试位 15 并继续将其他位移到位置 15。

您希望如何“提示用户”输入值?打印位与打印提示相同。

【讨论】:

  • 我只需将提示字符串的地址加载到 $a0 中,将值 4 放入 $v0 并执行系统调用以打印提示。我对打印有点困惑,因为我不知道要打印的位将在哪个寄存器中。
  • 不要认为它是打印 THE 位。将其视为 if-the-else:如果该位为 1,则加载 $a = "1" 并打印它。否则加载 $a = "0" 并打印它。您正在测试的位在 $t0 中,这也是您正在“打印”的位,但请注意引号 - 这不是您正在打印的位,它是对应的“1”或“0”提示字符串到位的状态。
  • 哦,有道理!我现在觉得很傻,我花了很多时间试图弄清楚如何打印寄存器的实际位。我想我现在已经弄清楚了大部分,但我最困惑的是访问第 15 位。我该如何测试那个特定的位?我假设在我的循环中我会将位的值放入寄存器,然后检查它是 0 还是 1,但我不知道如何将第 15 位放入寄存器。
  • 查看使用蒙版的部分。掩码是与数据进行“与”运算的位模式。你一定已经学会了如何测试一个寄存器的全零;设计一个位掩码(二进制值),当与 $t0 中的数据进行与运算时,如果位 15 为零,则结果为零,如果位 15 不为零,则结果为非零。您需要另一个临时寄存器来保存 AND 的结果。
  • 只是为了确保我理解 - 假设用户输入的数字是 45。那将是 16 位二进制补码中的 0000 0000 0010 1101。那么这是否意味着我应该使用的掩码应该是 1000 0000 0000 0000?当这两个被“与”时,如果第 15 位不为零,它将导致非零。而且我想这个掩码也适用于任何其他数字。
【解决方案2】:

掩码通常与“按位与”或“按位或”指令一起使用。 要确定某个数字中的某个特定位是否设置为 1, 您将该数字的“按位与”与另一个数字(“掩码”)相乘 其中该特定位设置为 1,所有其他位均为零。 (还有其他应用程序需要在其中设置多个位 一张面具;最好得到这些讲义的副本!)

有很多地方可以查找 MIPS 指令集。例如,herehere。 找到类似的页面,然后搜索“左移”和“按位与”。 (请记住您在哪里找到该文档,以便以后查找其他内容!)

【讨论】:

  • 我已经编辑了我的描述,我现在可以转换,但我不知道如何打印特定的位。并感谢您的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2018-03-21
  • 2020-04-18
相关资源
最近更新 更多