今回は、「シフト演算」のプログラムを作成する。
なお、本ブログでは、以前「シフト演算」を取り上げている。↓
条件は、符号なし整数を左右にシフトした値が、上位ビットが弾き出されない限り、2のべき乗での乗算や除算の計算結果と一致するものとする。
符号なし整数のシフトが2のべき乗での乗除算と等しいことを確認するプログラム
//符号なし整数のシフトが2のべき乗での乗除算と等しいことを確認するプログラム
#include <stdio.h>
//2のno乗を返す
unsigned pow2(unsigned no)
{
unsigned pw = 1;
while (no--)
pw *= 2;
return pw;
}
int main(void)
{
unsigned x,n;
printf("符号なし整数xをnビットシフトします\n");
printf("x:"); scanf("%u",&x);
printf("n:"); scanf("%u",&n);
unsigned m_pow = x * pow2(n); //2のn乗を乗じた値
unsigned d_pow = x / pow2(n); //2のn乗で除した値
unsigned l_sht = x << n; //nビット左シフトした値
unsigned r_sht = x >> n; //nビット右シフトした値
printf("[a] x × (2の%u乗) = %u\n",n,m_pow);
printf("[b] x ÷ (2の%u乗) = %u\n",n,d_pow);
printf("[c] x << %u = %u\n",n,l_sht);
printf("[d] x >> %u = %u\n",n,r_sht);
printf("[a]と[c]の値は一致%s\n",(m_pow == l_sht) ? "します":"しません");
printf("[b]と[d]の値は一致%s\n",(d_pow == r_sht) ? "します":"しません");
return 0;
}
実行結果
符号なし整数xをnビットシフトします
x:100
n:3
[a] x × (2の3乗) = 800
[b] x ÷ (2の3乗) = 12
[c] x << 3 = 800
[d] x >> 3 = 12
[a]と[c]の値は一致します
[b]と[d]の値は一致します
実行結果2
符号なし整数xをnビットシフトします
x:20
n:2
[a] x × (2の2乗) = 80
[b] x ÷ (2の2乗) = 5
[c] x << 2 = 80
[d] x >> 2 = 5
[a]と[c]の値は一致します
[b]と[d]の値は一致します
「<< 演算子」と 「>>演算子」は、整数中の全ビットを左または右にシフトした値を生成する演算子である。
<< 演算子による左シフト
x << n は、xの全ビットをnビット左にシフトして、右側(下位側)の空いたビットに0を埋める。
nが符号なし整数型であれば、シフト結果は$x×2^{n}$である。
>>演算子による右シフト
x >> n は、xの全ビットをnビット右にシフトする。xが符号なし整数型であるか、符号つき整数型の非負値であれば、$x÷2^{n}$の商の整数部がシフト結果となる。
関数pow2は、2のno乗を求める関数である。
本プログラムでは、シフト演算の結果と関数pow2で求めたべき乗値が一致することが確認できる。
(参考)新・解きながら学ぶC言語 第2版 柴田望洋 (監修・著)、 由梨かおる(著)SBクリエイティブ
コメント