编写一个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来回答这个问题?
答案 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的幂。