计算二进制表示左侧的1的数量

时间:2016-12-11 00:18:16

标签: mips

我试图在左侧获得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的新手。可能整件事都错了。

1 个答案:

答案 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: