arm64 取一个32位数除以10的余数计算


;w24 是输入的32bit的数字
;w9  是w32/10的余数

 MOVZ w8, #0xcccd           | W8 = 52429 (0xCCCD);//ML01              
 MOVK w8, #0xcccc, lsl #16  | W8 = 3435973837 (0xCCCCCCCD);           
 UMULL x8, w24, w8    
 LSR x8, x8, #0x23          | X8 = (3435973837 >> 35) = 0 (0x00000000);

 MOVZ w9, #0xa              | W9 = 10 (0xA);//ML01                    
 MSUB w9, w8, w9, w24       | W9 = (levelNo - 0 * 10) = 0 (0x00000000);

汇编代码如上, 相当神奇,特别立贴,记录一下,

等效的c代码如下:

uint32_t calc_10_remain(uint32_t levelNo) {
    uint32_t w8 = 0xCCCCCCCD;  // 52429 (0xCCCD)

    uint64_t result = (uint64_t)levelNo * w8;  // levelNo is multiplied with w8
     printf(" result %lx\n",result);
    result >>= 35;  // Logical shift right by 35 bits
    printf(" result %lx\n",result);
    return = levelNo - ((uint32_t)(result * 10))  ;  // Perform the calculation
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值