Assembly 识别整数的二次幂

Assembly 识别整数的二次幂,assembly,mips,Assembly,Mips,我有一个数字,它是2的幂。(示例:2^k) 我想在不使用循环、除法或任何函数的情况下获得k的值? 可以使用位运算、加、减、条件。 如果您有任何算法或代码,请提供一些帮助 我有一个数字,它是2的幂。(示例:2^k)我希望在不使用循环的情况下获得k的值 一些MIPS CPU有一个CLZ指令,用于计算前导零的数量。如果将该指令的结果反转,则得到第一个设置位的索引 如果您没有CLZ指令,您可以通过以下方式实现相同的功能。可能会有更紧凑的实现,但这至少是一个无分支的实现,用于查找整数的log2(它是的一个

我有一个数字,它是2的幂。(示例:2^k) 我想在不使用循环、除法或任何函数的情况下获得k的值? 可以使用位运算、加、减、条件。 如果您有任何算法或代码,请提供一些帮助

我有一个数字,它是2的幂。(示例:2^k)我希望在不使用循环的情况下获得k的值

一些MIPS CPU有一个
CLZ
指令,用于计算前导零的数量。如果将该指令的结果反转,则得到第一个设置位的索引

如果您没有
CLZ
指令,您可以通过以下方式实现相同的功能。可能会有更紧凑的实现,但这至少是一个无分支的实现,用于查找整数的log2(它是的一个变体):

#要查找的日志2的编号
李:512美元
李元1,0
李$t2,0xFFFF0000
和$t3、$t2、$t0
sltu$t4、$零、$t3#如果($t0&0xFFFF0000)==0){
xori$t4,$t4,1
sll$t4,$t4,4
加上$t1,$t1,$t4#$t1+=16

sllv$t0,$t0,$t4#$t0如果我可以问的话,为什么不允许您使用循环?这是一个课堂项目,要求您以特定的方式进行操作吗?如果不是,循环将更易于编码和理解:

.text
# The number to find log2 of
li $t0,512

add $t1, $zero, $zero # init counter with 2^0
addi $t2, $zero, 1 # init mask

loop:
and $t3, $t0, $t2 # mask all but current bit
bne $t3, $zero, done

# Current bit of $t1 is zero. Look at the next one to the left.
sll $t2, $t2, 1  # shift mask
addi $t1, $t1, 1 # bump counter
j loop

done:
# $t1 contains power of 2 (original number = 2^$t1)

警告:此代码不会检查它是否真的是2的幂,并且对于0来说是一个无止境的循环!这些验证留给学生作为练习。:)

使用包含32个条目的查找表可能比使用此代码更简单。
.text
# The number to find log2 of
li $t0,512

add $t1, $zero, $zero # init counter with 2^0
addi $t2, $zero, 1 # init mask

loop:
and $t3, $t0, $t2 # mask all but current bit
bne $t3, $zero, done

# Current bit of $t1 is zero. Look at the next one to the left.
sll $t2, $t2, 1  # shift mask
addi $t1, $t1, 1 # bump counter
j loop

done:
# $t1 contains power of 2 (original number = 2^$t1)