Как посчитать, сколько бит в десятичном числе равно 1?
Эта программа, которую я создал в приложении RISC-V RARS 1.3, предназначена для вычисления десятичного числа и подсчета количества битов в этом числе. Я тестирую десятичное число 5, и эта программа должна работать для любого положительного числа, которое я поставил на t1. Вот созданный мной код. Программа предназначена для добавления одного счетчика всякий раз, когда результат функции И не равен 0, но у меня проблема в том, что программа не останавливается. Есть решение этой проблемы?
_start:
li t1,2 # start with decimal 5, binary 101
li t2,1 # adding counter for AND function
li t3,0 # bit counter count
li t4,0 # to compare 0
and t5,t1,t2 # t1 & t2 = t5
bne t5,t4,label # go to label if t5 != 0
beqz t5,label2 # go to label if t5 == 0
label:
addi t3,t3,1 # add one to bit count
slli t2,t2,1 # shift left
and t5,t1,t2 # t1 & new t2 = t5
bne t5,t4,label # go to label if t5 != 0
beqz t5,label2 # go to label if t5 == 0
label2:
slli t2,t2,1 # shift left
and t5,t1,t2 # t1 & new t2 = t5
.data
2 ответа
Если RISC-V не имеет инструкции, которая эффективно подсчитывает количество установленных битов (сейчас это делает большинство других процессоров); тогда следующий лучший подход выглядит так:
// Value is 32 pieces with 1 bit per piece
temp1 = (value & 0x555555555) + (value & 0xAAAAAAAA) >> 1;
// Temp1 is 16 pieces with 2 bits per piece
temp2 = (temp1 & 0x33333333) + (temp1 & 0xCCCCCCCC) >> 2;
// Temp2 is 8 pieces with 4 bits per piece
temp3 = (temp2 & 0x0F0F0F0F) + (temp2 & 0xF0F0F0F0) >> 4;
// Temp3 is 4 pieces with 8 bits per piece
temp4 = (temp3 & 0x00FF00FF) + (temp3 & 0xFF00FF00) >> 8;
// Temp4 is 2 pieces with 16 bits per piece
result = (temp4 & 0x0000FFFF) + (temp2 & 0xFFFF0000) >> 16;
// Result is the count of all bits that were set in value (or, sum of all 32 of the original 1-bit values)
Я понятия не имею, как написать это в сборке RISC-V (я бы скомпилировал ее, а затем вырезал и вставил полученную сборку, но у меня тоже нет компилятора для RISC-V).
Поскольку вы начинаете с
t2 = 1
и умножить на
2
на каждой итерации вы должны останавливать вычисление, как только значение
t2
становится больше, чем
t1
.
Кроме того, в вашем коде я вижу, что вы, вероятно, намеревались обработать два случая:
label:
- этот блок обрабатывает случай, когда текущий проверяемый бит равен 1, он увеличивает количество битов и затем переходит к любому из них.label
или жеlabel2
. Здесь вам просто нужно добавить условие выхода, как указано выше.label2:
- этот блок обрабатывает случай, когда текущий проверяемый бит равен 0, он не меняет количество битов, но он также, похоже, не продолжает ни с однимlabel
или жеlabel2
. Я думаю, что нужно продолжать искать, есть ли какие-либо более высокие 1 бит, пока не произойдет условие выходаt2>t1
достигнуто.