ganon
@ganon

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

シフト演算について

Q&A

Closed

以下の問題について。
文字列を 4 文字まで入力し、これらをひとつの int 型にまとめて 16 進で表示してください。 たとえば、「ABC」と入力された場合は「414243」と表示します。

文字配列 str を宣言し、文字列を入力します。入力する文字数は最長で 4 文字までですが、配列 の要素数は余裕をもって 100 とし、入力には scanf で「%s」書式を使います。char 型は 1 バイ ト、(典型的な)int 型は 4 バイトなので、4 つの文字コードを 1 つの int 型にまとめられます。 表示するときは「%X」書式を使います。
str => ABC
414243

str => 1234
31323334

#include<stdio.h>
#include <stdlib.h>
int main(){
  unsigned int num,a;
  char str[100];
  printf("str =>");
  scanf("%s",str);
  int code=0;
  for(int i=0;i<4&&str[i]!='\0';i++){
    code=(code<<8|(unsigned char)str[i]);
  }
  printf("%X\n",code);
}

forの中身がよくわかっていません。一文字で8ビット使うから左に8ビットシフトしていますよね?0との論理和を取るため、'A'なら0x41=01000001のため、そのままの値がcodeに代入されていく。といった認識でよろしいのでしょうか?
そこでcode=0xFF000000とし、&で論理積をとっても同じ回答は得られませんでした。このコードの説明をお願いしたいです。
あと、このやり方は回りくどくないですか?printf("%X",str[i])で良いと思うのですが。

0

3Answer

使用していない変数は削除してください。

forの中身がよくわかっていません。一文字で8ビット使うから左に8ビットシフトしていますよね?0との論理和を取るため、'A'なら0x41=01000001のため、そのままの値がcodeに代入されていく。といった認識でよろしいのでしょうか?

学校の課題か何かっぽいですが、あなたが書いたコードなら、あなたが動作理解してないとまずいんじゃないですか?誰かにコードを書かせたんですか?
分からなければ、デバッガで1ステップづつ実行して値を確認しましょう。
変数の値の変化を見ればすぐ判る事でしょう。

あと、このやり方は回りくどくないですか?printf("%X",str[i])で良いと思うのですが。

一つのint型にまとめる、という論理演算を学ばせる事が趣旨かと推測しますが、
どういう意図があるかは第三者の知る所ではないので、
そのような事は出題者に聞いてください。

あと、あなた過去にもC言語の質問していたと思いますけど、何故過去の質問を削除したんです?回答者してくれた人の善意・労力を無駄にするような行為はやめましょう。

3Like

これらをひとつの int 型にまとめて 16 進で表示してください。

課題文に書かれてることは無視しないでください。

あと、このやり方は回りくどくないですか?printf("%X",str[i])で良いと思うのですが。

例えばの話ですが課題者がオムライスを作ってくださいと言っているのに
あなたはお米炊くのめんどくさいからとオムレツ作ろうとしてます。
めんどくさいと思うのはわかりますが 外は同じだけど中が違うものを作ろうとしています。

最後にですが次に質問をされる時はガイドラインをきちんと読んでから投稿するようにしてください。

1Like

あと、このやり方は回りくどくないですか?
くどいより、ひどいです。文字処理とビット演算の出題するため、出題者が考えた技巧に凝ったコードです。

forの中身がよくわかっていません
①for()の中身 

char str[100];
scanf("%s",str);
for(int i=0;i<4&&str[i]!='\0';i++){
   print(str[i]));
}

i<4&&str[i]!='\0' は継続条件として0~3までで0x00以外

char str[100];で100バイト0x00で初期化されているので入力桁が4文字未満のとき終了させる(末尾に改行¥nが入るか?0x00なのか?確認してください)

scanf("%s",str);ではなく、

fgets(str, 100, stdin);かな?

②for{}の中身

int code=0;
for(int i=0;継続条件;i++){
  code=(code<<8|(unsigned char)str[i]);
}

(unsigned char)str[i] はint code=0 に代入するので文字1バイトを数値1バイトに型変換してます。

ABC の場合 414243 のstr[0]の41
00000000|00000041 で結果00000041
code<<8 で 左シフトし、00004100

次にstr[1]の42は
00004100|00000042 で結果00004142
code<<8 で 左シフトし、00414200

次にstr[2]の43は
00414200|00000043 で結果00414243

備考:code<<8 の左シフトが | 演算より先にされるか?後にされるか?ロジック的に矛盾がないのか?は上記URLを参照し、判断ください。

0Like

Your answer might help someone💌