割り算

疑問点:割り算の高速化のためシフト演算子を使う意味はあるか?

結論:最近のコンパイラは賢いので割り算だからといってシフト演算子を使う意味はない。

割る数が2のべき乗でない場合 → 除算命令が生成される

source

void testFunc (unsigned long val)
{
    unsigned long result = val / 5;
    printf ("%ld\r\n", result);
}

assembly

0x080049CC 2105      MOVS          r1,#0x05
0x080049CE FBB0F1F1  UDIV          r1,r0,r1
0x080049D2 A001      ADR           r0,{pc}+0x08  ; @0x080049D8
0x080049D4 F7FBBDA4  B.W           __2printf (0x08000520)

割る数が2のべき乗である場合 → ビットシフト命令が生成される(コンパイラによる最適化)

source

void testFunc (unsigned long val)
{
    unsigned long result = val / 8;
    printf ("%ld\r\n", result);
}

assembly

0x080049CC 08C1      LSRS          r1,r0,#3
0x080049CE A001      ADR           r0,{pc}+0x08  ; @0x080049D4
0x080049D0 F7FBBDA6  B.W           __2printf (0x08000520)

シフト演算子の場合 → もちろんビットシフト命令が生成される

source

void testFunc (unsigned long val)
{
    unsigned long result = val >> 3;
    printf ("%ld\r\n", result);
}

assembly

0x080049CC 08C1      LSRS          r1,r0,#3
0x080049CE A001      ADR           r0,{pc}+0x08  ; @0x080049D4
0x080049D0 F7FBBDA6  B.W           __2printf (0x08000520)


Please log in to post comments.