c - 这个关系 $s1 = Floor( log2 ($t0) ) 的 mips 逻辑是什么?

标签 c mips

这是给出的 C 片段代码。

     addi $s1, $zero, 0

 loop: srl $t0, $t0, 1

     beq $t0, $zero, exit
     addi $s1, $s1, 1
     j loop 
exit

有人问我 $s1 和 $t0 之间是什么关系。从C代码中我可以看出 $t0 每次循环右移 1 位 ($t0 = $t0/2),直到变为 0 并且 $s1 就是 $s1 = $s1 + 1,每个循环加 1 该关系的答案是 $s1 = Floor( log2 ($t0) ),但我不明白这种关系背后的逻辑。 谁可以给我解释一下这个? 谢谢

最佳答案

循环计算可以在 $t0 上执行的连续右移(即除以 2)的次数,且结果不为零。

这也可以表示为查找 $t0 中最左边 1 位的(从零开始的)位置。由于我们只关心最左边的 1,我们可以依次将其表示为找到最大整数 z,使得 2z <= $t0

我们可以利用对数和指数之间的关系,那就是

logb(m) = n  如果  bn = m

所以$t0 = 2n,其中n = log2($t0),这也意味着$t0 = 2log2($t0)

因此,我们有兴趣找到最大整数 z,使得 2z <= 2log2( $t0)

由于 2x 是单调递增函数,因此 2x <= 2y 表示 x <= y。因此,我们可以将我们正在寻找的最大整数 z 简化为 z <= log2($t0),即floor(log2($t0)) 的定义。

关于c - 这个关系 $s1 = Floor( log2 ($t0) ) 的 mips 逻辑是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58381590/

相关文章:

c - 同类指针的区别

c - 内存泄漏同步读取中断通过libUSB传输数据

c - 程序中的变量是否连续存储在内存中?

jvm - JRE 架构依赖项(在 MIPS 上运行)

c - 将 C 语言转换为 MIPS 代码(了解 MIPS 中的内存访问)

assembly - 程序计数器?

c - C中#include的尴尬问题

将字符转换为 C 中跳转表的索引

linux - 在 MIPS TLB 中,除了 ASID 字段之外,两个条目是否可能相同?

c - 如何在不使用逻辑运算符的情况下在C中打印2个字符?