编写一个MIPS程序,测试一个数字是否为2的幂

时间:2015-02-18 22:06:41

标签: loops mips

编写一个MIPS程序,测试一个数字是否为2的幂。将寄存器$ t0设置为SPIM中的某个值,并将其用于测试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 个答案:

答案 0 :(得分:3)

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

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

这是有效的,因为2的幂将具有000…010…0形式的二进制表示,并且小于它的数字将具有形式000…001…1的二进制表示。也就是说,2的幂只有一位设置,并且在该组之前的每一位都比它少一位。结果,这些数字之间的按位AND将为零,因为它们没有共同的设置位。每隔一对连续的数字将共享一些共同的设置位,因此它们之间的按位AND不会为零。

(注意,这个算法会告诉你1是2的幂。这是正确的:2到0的幂是1!)

由于这显然是一项课程作业,我将让您自己将其转换为MIPS代码。 :)

答案 1 :(得分:1)

$t1初始化为1之后,您应该在每次循环迭代中对$t1进行左移。在每次循环迭代中,$t1寄存器将等于2的新幂。

如果$t1等于$t0,您应该跳出循环。这是$t0是2的幂的情况。如果左移后$t1变为0,则$t0不是2的幂。