ARM сдвиг влево или арифметическое вправо в зависимости от знака счетчика сдвигов для эффективного умножения на любую степень 2

Это другой способ ... (с ограниченным диапазоном)

public static String numToWord(Integer i) {

 final  String[] units = { "Zero", "One", "Two", "Three",
        "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven",
        "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen",
        "Seventeen", "Eighteen", "Nineteen" };
 final  String[] tens = { "", "", "Twenty", "Thirty", "Forty",
        "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
    if (i < 20)
        return units[i];
    if (i < 100)
        return tens[i / 10] + ((i % 10 > 0) ? " " + numToWord(i % 10) : "");
    if (i < 1000)
        return units[i / 100] + " Hundred"
                + ((i % 100 > 0) ? " and " + numToWord(i % 100) : "");
    if (i < 1000000)
        return numToWord(i / 1000) + " Thousand "
                + ((i % 1000 > 0) ? " " + numToWord(i % 1000) : "");
    return numToWord(i / 1000000) + " Million "
            + ((i % 1000000 > 0) ? " " + numToWord(i % 1000000) : "");
}
1
задан Peter Cordes 2 March 2019 в 06:03
поделиться

1 ответ

Да, это слишком много кода.

Вы хотите использовать этот трюк для реализации целочисленного деления со знаком с точки зрения сдвигов, при этом сохраняя семантику округления n / 2 (в сторону 0), в отличие от сдвигов, которые округляют в сторону -infinity.

Вы, вероятно, хотите использовать условное выполнение.

Ваш код может быть таким коротким, как , это :

shiftS32:
        cmp     r1, #0
        asrlt   r2, r0, #31
        addlt   r3, r1, #32
        lslge   r0, r0, r1
        rsblt   r1, r1, #0
        addlt   r0, r0, r2, lsr r3
        asrlt   r0, r0, r1
        bx      lr

И немного теста здесь .

0
ответ дан Peter Cordes 2 March 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: