初めてこちらで質問させて頂きます。
自分は今、学校の課題の左シフト演算のプログラムを組めという課題に取り組んでいます。
しかし、以下のような結果にしたいのですが、どうしても出来ません。
データ(符号なし) :1010 1011 1100 1101
左回転シフト(4ビット) :1011 1100 1101 1010
データ(符号なし) :1010 1011 1100 1101
左回転シフト(20ビット):1011 1100 1101 1010
八方塞がりで、あらゆる観点からググっても解決に一ミリも達成しないと見てこちらに質問させて頂きました。
ソースコードは以下の通りです。
/* ヘッダファイル ------------------------------------------------------- */
#include <stdio.h>
/* プロトタイプ宣言 ----------------------------------------------------- */
void PutBin(short int data);
unsigned short int LeftRotate(unsigned short int data, int bit);
/* エントリポイント ----------------------------------------------------- */
int main(void)
{
unsigned short int data = 0xABCD;
unsigned short int ans;
// 左回転シフト(4ビット)
ans = LeftRotate(data, 4);
// 結果を出力
printf("データ(符号なし) :");
PutBin(data);
putchar('\n');
printf("左回転シフト(4ビット) :");
PutBin(ans);
putchar('\n');
// 左回転シフト(20ビット)
ans = LeftRotate(data, 20);
// 結果を出力
printf("データ(符号なし) :");
PutBin(data);
putchar('\n');
printf("左回転シフト(20ビット):");
PutBin(ans);
putchar('\n');
return 0;
}
/* ---------------------------------------------------------------------- */
/* 関数名:PutBin */
/* 機 能:引数で受け取ったデータを2進数出力する */
/* 戻り値:なし */
/* 引 数:short int data :処理対象のデータ */
/* ---------------------------------------------------------------------- */
void PutBin(short int data)
{
int bit;
short int flg;
// short int 型のサイズ分処理を行う
for (bit = sizeof(short int) * 8 - 1; bit >= 0; bit--) {
flg = data & (0x1 << bit); // 対象ビットを取り出す
printf("%d", flg ? 1 : 0); // 対象ビットを出力
// 見やすくするために、4ビットごとに空白を出力
if (bit % 4 == 0) {
printf(" ");
}
}
}
/* ---------------------------------------------------------------------- */
/* 関数名:LeftRotate */
/* 機 能:引数で受け取ったデータを左回転シフトする */
/* 戻り値:左回転シフト後のデータ(unsigned short int 型) */
/* 引 数:unsigned short int data :処理対象のデータ */
/* int bit :左回転シフトするビット数 */
/* ---------------------------------------------------------------------- */
unsigned short int LeftRotate(unsigned short int data, int bit)
{
unsigned short int flg;
data <<= bit;//指定されたビットの数分左シフトを行う
flg = data & 0x1;
if (flg) {
data |= (0x1 << sizeof(unsigned short int) * 8 - 1);
};
return data;
}
データ(符号なし) :1010 1011 1100 1101
左回転シフト(4ビット) :1011 1100 1101 0000
データ(符号なし) :1010 1011 1100 1101
左回転シフト(20ビット):0000 0000 0000 0000
のような結果になってしまいます。
回転シフトが、はみ出た分は全て破棄されて0が新たに挿入されるというのは知っていますが、どうにかしかして、最初に書きました結果を出したいです。
[2] 環境
Windows10 Home ,VS2019
[3] その他
C言語2級レベル程度の理解度があります。
初めてこちらに投稿させて頂きますがよろしくお願いします。
学校の課題ですので出来れば早めにお願いします。