c - 这种关系 $s1 = floor( log2 ($t0) ) 的 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) 。
这也可以表示为在 中找到最左边1
位的(从零开始的)位置$t0
。由于我们只关心最左边的1
,我们可以反过来将其表示为找到最大的整数z使得2 z <= $t0。
我们可以利用对数和取幂之间的关系,即
log b (m) = n 如果 b n = m
所以$t0 = 2 n其中n = log 2 ($t0),这也意味着$t0 = 2 log 2 ($t0)
因此,我们有兴趣找到最大的整数z使得2 z <= 2 log 2 ($t0)
由于2 x是一个单调递增的函数,因此对于x <= y来说2 x <= 2 y。所以我们可以将我们正在寻找的最大整数z简化为z <= log 2 ($t0),这是floor(log 2 ($t0))的定义。
推荐阅读
- c++ - C++:创建返回数组大小的函数
- c++ - 将缓冲区/纹理数据从 GPU 传输到 CPU 的最快方法
- javascript - JavaScript 中的 `in` 关键字究竟是什么?
- javascript - 尝试将一对数组值随机推送到另一个数组中而不重复javascript
- html - 我将如何在这段代码中使用@mixin 和@include?
- node.js - 嵌套数组的猫鼬设置值
- laravel-8 - 在共享主机空白页面上推送我的网站后
- electron - 文件夹中的随机图像
- javascript - 如何将用户的 displayName 添加到 Firestore 数据库集合条目?
- python - Python Websocket收到错误无效令牌