我试图在左侧获得1的数字(第16-31位)这段代码似乎有效但我从一定的整数中得到1个额外的数。
例如: 二进制1536是0000 0000 0000 0000 | 0000 0110 0000 0000 并且我在左侧获得0 1是正确的。
此外: 100000左侧二进制是0000 0000 0000 0001 我的结果是1.这也是正确的。
然而: 二进制1000000000是0011 1011 1001 1010 | 1100 1010 0000 0000 我在左侧获得10个1而不是9个。
我也测试了其他数字,但他们也有额外的数字。
#Displays number of 1's on left half
li $v0, 4
la $a0, left
syscall
li $t2, 0 #i = 0
srl $t3, $s0, 16 #shifts users number to the right by 16 bits
Counter:
and $t4, $t3, 1 #Mask off bit
beq $t4, 1, Count #if mask = 1 go to count
srl $t3, $t3, 1 #if mask != 1 (aka 0) shifts right by 1
beq $t3, 0, Exit #once the shifted bits = 0 go to exit
Count:
add $t2, $t2, 1 #increment i++
srl $t3, $t3, 1 #shifts right by 1
j Counter
Exit:
li $v0, 1 #Displays number of 1's
move $a0, $t2
syscall
不确定代码是否正确,因为我是mips的新手。可能整件事都错了。
答案 0 :(得分:1)
您可以使用clz
/ clo
来计算前导零和1的数量,并使用它来计算1的数量。想法是消耗前导零,然后计算前导零(将这些位移出寄存器),直到输入数据为零。
即:
li $t1, 0x4F044321 % $t1 Input number
srl $t1, $t1, 16
sll $t1, $t1, 16 % Discard least significant bits
li $t2, 0 % $t2 will hold number of 1s
count:
beqz $t1, done
clz $t3, $t1
sllv $t1, $t1, $t3
clo $t3, $t1
addu $t2, $t2, $t3
sllv $t1, $t1, $t3
b count
done: