シフト演算のプログラムについての質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KBTIT
記事: 2
登録日時: 3年前

シフト演算のプログラムについての質問

#1

投稿記事 by KBTIT » 3年前

[1] 質問文
 初めてこちらで質問させて頂きます。
 自分は今、学校の課題の左シフト演算のプログラムを組めという課題に取り組んでいます。
 しかし、以下のような結果にしたいのですが、どうしても出来ません。
データ(符号なし) :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級レベル程度の理解度があります。
 初めてこちらに投稿させて頂きますがよろしくお願いします。
 学校の課題ですので出来れば早めにお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: シフト演算のプログラムについての質問

#2

投稿記事 by みけCAT » 3年前

・一周したら変わらないので、一周以内のシフト幅に補正する
・シフト幅が0なら、そのまま出力する
・そうでないなら、左に行った分を右に入れる

コード:

unsigned short int LeftRotate(unsigned short int data, int bit)
{
	int size = sizeof(unsigned short) * 8;
	bit %= size;
	if (bit < 0) bit += size;
	if (bit == 0) return data;
	return (data << bit) | (data >> (size - bit));
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

KBTIT
記事: 2
登録日時: 3年前

Re: シフト演算のプログラムについての質問

#3

投稿記事 by KBTIT » 3年前

ありがとうございます。
無事解決致しました。
こういう書き方もあるのですね…凄い…

アバター
usao
記事: 1887
登録日時: 11年前

Re: シフト演算のプログラムについての質問

#4

投稿記事 by usao » 3年前

オフトピック
> C言語2級レベル程度の...

C言語って級とか段とか(?)あるんすか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: シフト演算のプログラムについての質問

#5

投稿記事 by みけCAT » 3年前

オフトピック
usao さんが書きました:
3年前
> C言語2級レベル程度の...

C言語って級とか段とか(?)あるんすか?
これですか、わかりません。
試験内容 - 検定試験について - C言語プログラミング能力認定試験│資格検定のサーティファイ│あなたのスキルアップを応援します|
※現在Firefoxでは閲覧できないようです。Google Chromeなら警告は出るものの閲覧できました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る