loops - 编写一个 MIPS 程序来测试一个数是否是 2 的幂

标签 loops mips

编写一个 MIPS 程序来测试一个数是否是 2 的幂。在 SPIM 中将寄存器 $t0 设置为某个值,并将其用于测试 2 的幂。该程序将在控制台中生成输出。

35 不是 2 的幂。

256 是 2 的幂。

到目前为止,我有这个

    .data

    spc1:   .asciiz " "
    nl:     .asciiz "\n"
    tb:     .asciiz "\t"
    msg1:   .asciiz "is not a power of two."
    msg2:   .asciiz "is a power of two."

    .text    # "text section" code and read-only data

    .globl main # declare `main' as a global symbol

    main:   #sra $t1, $t0, 1
    li $t1, 1
    loop:   beq $t0, $t1, end
    sra $t0, $t0, 1
    j loop
    end:    la $a0, msg2
    li $v0, 4
    syscall
    addi $v0, $0, 10
    syscall

我在模拟器中设置了 $t0,这样就可以正常工作了。但无论我将其设置为多少,我都会得到“是二的幂”。我正在使用左移,但这一直给我错误的答案。如何正确使用shift来回答这个问题?

最佳答案

有一种更简单的方法来测试一个数是否是 2 的幂。在 C 伪代码中:

bool is_power_of_two(unsigned int number) {
    return (number & (number - 1)) == 0;
}

这是可行的,因为 2 的幂将具有 000…010…0 形式的二进制表示,而比它小的数将具有 000 形式的二进制表示…001…1。也就是说,2 的次方正好设置了一位,而比它小的数在该组之前的每一位都有。结果,这些数字之间的按位与将为零,因为它们没有共同的设置位。每隔一对连续的数字将共享一些共同的设置位,因此它们之间的按位与不会为零。

(注意这个算法会告诉你1是2的次方,这是正确的:2的0次方就是1!)

由于这显然是一个类作业,我会让你自己将其翻译成 MIPS 代码。 :)

关于loops - 编写一个 MIPS 程序来测试一个数是否是 2 的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28594866/

相关文章:

javascript - 自动化父层次结构

python - 如何将列表的每个元素组合到另一个列表?

assembly - 引导加载程序参数通过参数寄存器传递到 Linux 内核 (MIPS 24KEc)

assembly - MIPS 上的嵌套子程序调用

java - Java中如何获取for循环的最后一个值?

javascript - 循环遍历数组内的数组以确定值

javascript - 如何循环遍历 JSON 数组并获取特定值

linux - GStreamer 上的 'blacklisted' 是什么意思?

c++ - 如何向 MIPS 中的函数添加 4 个以上的参数?