首页 > 解决方案 > 如何计算十进制数中有多少位是1?

问题描述

我在 RISC-V RARS 1.3 应用程序中创建的这个程序旨在获取一个十进制数并计算该数字中有多少位。我正在测试的是十进制数 5,这个程序应该适用于我放在 t1 上的任何正数。这是我创建的代码。该程序旨在每当 AND 函数的结果不为 0 时添加一个计数器,但我遇到的问题是程序没有停止。这个问题有解决方案吗?

_start:

li t1,2 # start with decimal 5, binary 101
li t2,1 # adding counter for AND function
li t3,0 # bit counter count
li t4,0 # to compare 0

and t5,t1,t2 # t1 & t2 = t5
bne t5,t4,label # go to label if t5 != 0
beqz t5,label2 # go to label if t5 == 0

label:
addi t3,t3,1 # add one to bit count
slli t2,t2,1 # shift left
and t5,t1,t2 # t1 & new t2 = t5
bne t5,t4,label # go to label if t5 != 0
beqz t5,label2 # go to label if t5 == 0

label2:
slli t2,t2,1 # shift left
and t5,t1,t2 # t1 & new t2 = t5

.data

标签: assemblyriscvhammingweightpopulation-count

解决方案


由于您在每次迭代中开始t2 = 1并乘以它,2因此一旦 的值t2变得大于,您应该停止计算t1

另外,在您的代码中,我看到您可能打算处理两种情况:

  1. label:- 此块处理当前测试位为 1 的情况,它增加位数,然后跳转到labellabel2。在这里,您只需要添加上面提到的退出条件
  2. label2:- 此块处理当前测试位为 0 的情况,它不会更改位数,但似乎也不会继续使用labelor label2。我认为应该继续查看是否有更高的 1 位,直到t2>t1达到退出条件。

推荐阅读