プログラミング+α学習ブログ

勉強したことの備忘録です。

符号無し整数のシフトが2のべき乗での乗除算と等しいことを確認するプログラム

#include <stdio.h>

/*--- 2のno乗を返す ---*/
unsigned pow2(unsigned no)
{
    unsigned pw = 1;
    
    while (no--)
        pw *= 2;
    
    return (pw);
}

int main(void)
{
    unsigned m_pow, d_pow, l_sht, r_sht;
    unsigned a, n;
    
    printf("整数Aを入力してください:");    scanf("%u", &a);
    printf("何ビットシフトしますか:"); scanf("%u", &n);
    
    m_pow = a * pow2(n);    // 2のn乗をかけた値
    d_pow = a / pow2(n);    // 2のn乗で割った値
    
    l_sht = a << n; // nビット左にシフトした値
    r_sht = a >> n; // nビット右にシフトした値
    
    printf("A × (2の%u乗) = %u\n", n, m_pow);
    printf("A ÷ (2の%u乗) = %u\n", n, d_pow);
    printf("A << %u = %u\n", n, l_sht);
    printf("A >> %u = %u\n", n, r_sht);
    
    if (r_sht == d_pow && l_sht == m_pow)
        printf("符号無し整数%uの左右%uビットシフトは、\n"
               "2の%u乗での乗算や除算と等しいです。\n", a, n, n);
    
    return (0);
}

実行結果

整数Aを入力してください:170
何ビットシフトしますか:4
A × (2の4乗) = 2720
A ÷ (2の4乗) = 10
A << 4 = 2720
A >> 4 = 10
符号無し整数170の左右4ビットシフトは、
2の4乗での乗算や除算と等しいです。