У меня есть число, и оно равно 2. (пример: 2^k) Я хочу получить значение k без использования цикла, деления или какой-либо функции? бит функционирование, плюс, вычесть, состояние можно использовать. Некоторая помощь, пожалуйста, если у вас есть алгоритм или код.Признать силу двух целых чисел
ответ
У меня есть число, и это сила 2. (например: 2^к) я хочу, чтобы получить значение к без использования цикла
Некоторых процессоров MIPS имеет CLZ
инструкции для подсчета число начальных нулей. Если вы инвертируете результат из этой команды, вы получаете индекс первого бита набора.
Если у вас нет инструкции CLZ
, вы можете достичь той же цели следующим образом. Там может быть более компактными реализации, но это, по крайней мере, филиал менее реализации для нахождения log2 целого числа (это вариант 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
Почему вы не можете использовать петлю, если я можно спросить? Это классный проект, в котором вам говорят сделать это определенным образом? Если нет, то цикл будет намного проще кодировать и проще понять:
.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. Расчет двух целых чисел
- 2. Печать двух целых чисел
- 3. Добавление двух целых чисел
- 4. Сравнение двух пар целых чисел
- 5. [InterviewBit] Сила двух целых чисел
- 6. Сравнение частного двух целых чисел
- 7. Модуля произведения двух целых чисел
- 8. , сравнивая значения двух целых чисел
- 9. среднего значения двух целых чисел
- 10. Добавление двух целых чисел равно
- 11. Модифицированное деление двух целых чисел
- 12. Сортировка двух массивных целых чисел
- 13. Псевдослучайный хэш двух целых чисел
- 14. XOR двух коротких целых чисел
- 15. Исправить GCD двух целых чисел
- 16. Сравнение двух целых чисел в директиве AngularJS
- 17. печать двух разных целых чисел в конце
- 18. Отображение двух целых чисел в одной колонке
- 19. Атомно приращение двух целых чисел с CAS
- 20. Как проверить зсапЕ двух целых чисел с
- 21. Возвращение двух целых чисел с циклами?
- 22. использование двух разных целых чисел на C
- 23. Как суммировать цифры двух целых чисел?
- 24. код сборки для добавления двух целых чисел
- 25. Обмен двух 2D-массивов целых чисел
- 26. MVC Razor Дополнительно двух целых чисел?
- 27. Комбинирование двух целых чисел в 1?
- 28. Общая функция для сравнения двух целых чисел?
- 29. Сочетание двух целых чисел с битовым сдвигом
- 30. NumberFormatException при умножении двух целых чисел
Вместо этого кода, вероятно, проще использовать таблицу поиска с 32 элементами. – dbrank0