我有一個數字,它是2的冪。(例如:2^k) 我想獲得k的值,而不使用循環,除法或任何類型的函數? 位操作,加,減,條件都可以使用。 有些幫助,如果你有任何算法或代碼。Recogniz冪的兩個整數
1
A
回答
2
我有一個數字,它是2的冪(例如:2^k)的我想獲得k的值,而無需使用環
有些MIPS CPU具有用於計數一個CLZ
指令前導零的數量。如果反轉該指令的結果,則會得到第一個設置位的索引。
如果您沒有CLZ
指令,您可以通過以下方式實現相同的目的。有可能是更緊湊的實現,但是這至少找到一個整數的log 2分支少的實現(它是this變體):
# The number to find log2 of
li $t0,512
li $t1,0
li $t2,0xFFFF0000
and $t3,$t2,$t0
sltu $t4,$zero,$t3 # if (($t0 & 0xFFFF0000) == 0) {
xori $t4,$t4,1
sll $t4,$t4,4
addu $t1,$t1,$t4 # $t1 += 16
sllv $t0,$t0,$t4 # $t0 <<= 16 }
sll $t2,$t2,8 # $t2 = 0xFF000000
and $t3,$t2,$t0
sltu $t4,$zero,$t3 # if (($t0 & 0xFF000000) == 0) {
xori $t4,$t4,1
sll $t4,$t4,3
addu $t1,$t1,$t4
sllv $t0,$t0,$t4
sll $t2,$t2,4
and $t3,$t2,$t0
sltu $t4,$zero,$t3 # if (($t0 & 0xF0000000) == 0) {
xori $t4,$t4,1
sll $t4,$t4,2
addu $t1,$t1,$t4
sllv $t0,$t0,$t4
sll $t2,$t2,2
and $t3,$t2,$t0
sltu $t4,$zero,$t3 # if (($t0 & 0xC0000000) == 0) {
xori $t4,$t4,1
sll $t4,$t4,1
addu $t1,$t1,$t4
sllv $t0,$t0,$t4
sll $t2,$t2,1
and $t3,$t2,$t0
sltu $t4,$zero,$t3 # if (($t0 & 0x80000000) == 0) {
xori $t4,$t4,1
addu $t1,$t1,$t4
xori $t0,$t1,31 # $t1 holds the number of leading zeroes; invert to get the highest set bit
# The output is in $t0
1
你爲什麼不允許使用循環,如果我可能會問?這是一個課程項目,你被告知要以特定的方式來完成嗎?如果不是這樣,一個循環就容易得多代碼和容易理解:
.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!這些驗證留給學生練習。 :)
相關問題
- 1. 將GMP整數轉換爲兩個冪的和(2n)
- 2. 檢查整數是否是C中的兩個冪#
- 3. 如何讓一個整數的冪-1?
- 4. 編譯時遞歸函數計算一個整數的下一個冪次冪?
- 5. 如何將一個奇數整數向兩個最接近的冪運算
- 6. 沒有使用大整數的大冪
- 7. PHP整數求冪(超大數字)
- 8. WebGL和長方形(兩個冪)紋理
- 9. 模數求冪函數中的整數溢出
- 10. 使用「兩個數字的冪」作爲數據庫列的長度
- 11. 以兩位數的整數數組,並存儲爲兩個單數位整數
- 12. 添加兩個整數JavaScript
- 13. 打印兩個整數
- 14. 連接兩個整數
- 15. 創建兩個整數
- 16. 比較兩個整數
- 17. 計算兩個整數
- 18. 在C#中計算2的整數冪的簡單方法?
- 19. 除以2的冪的有符號整數
- 20. 整數的大小不是2的冪,是否有意義?
- 21. 將無符號整數舍入爲2的冪的序列
- 22. 打印輸出:整數作爲2的冪的總和
- 23. 返回給定整數的下一個最接近的2的冪
- 24. 調整兩列對一個整數集
- 25. 檢查一個正整數是否爲2的冪的最短方法
- 26. 將整數轉換爲按位後的個別冪的計算,其總和等於輸出整數之和
- 27. VBA - 模數求冪
- 28. Java:作爲HashMap大小的「主要」編號或「兩個冪」?
- 29. 如何在C中實現邏輯移位的兩個冪?
- 30. 兩個列表性能的Python冪運算
而不是這個代碼,它可能更簡單的使用32條目的查找表。 – dbrank0