C言語関係掲示板

過去ログ

No.938 unsigned int型変数を8ビットずつ分割して、4つの整数に格納

[戻る] [ホームページ]
No.11929

ビット演算のことでご教授お願いしたいのですが。。
投稿者---初心者小次郎(2004/01/19 13:45:37)


1つのunsigned int型変数を8ビットずつ分割して、
4つの整数(0〜255)を格納、表示できるようにしたいのですが、
やり方がイマイチわかりません。
また、0〜255以外の数字が入力された場合、
エラーメッセージを出さなくてはなりません。

基本的にscanfで4つの数字を入力して、printfで出力するのですが、
8ビットずつ区切って1つの変数に入れるという処理がわかりません。
ご教授お願いします。

No.11958

Re:ビット演算のことでご教授お願いしたいのですが。。
投稿者---RAPT(2004/01/20 01:31:01)


環境を書きましょう。

> 1つのunsigned int型変数を8ビットずつ分割して、
> 4つの整数(0〜255)を格納、表示できるようにしたい
ってことは、int型が32ビットの処理系ってことでいいの?

unionを使うとか、ビットシフトを使うとか、ビットフィールドを使うとか。

> また、0〜255以外の数字が入力された場合、
> エラーメッセージを出さなくてはなりません。
これは入力系でチェックをかければいいことでしょう。


#include <stdio.h>

union UNION_NAME{
  struct{
    unsigned char n0, n1, n2, n3;
  } bit8;
  unsigned int value;
} v;

int main()
{
  int i;
  unsigned int value, n[4];
  char buff[1+BUFSIZ];
  for(i = 0; i < 4; ++i){
    printf("%d番目の値を入力してください:", 1+i);
    fgets(buff, BUFSIZ, stdin);
    if (sscanf(buff, " %u ", &n[i]) != 1 || n[i] > 255){
      fprintf(stdout, "error:0-255以内の数字を入力してください。\n\n");
      --i;
      continue;
    }
  }

  printf("ビットシフトのテスト\n");
  value = n[0] | n[1] << 8 | n[2] << 16 | n[3] << 24;
  for(i = 3; i >= 0; --i){
    printf("[%u]", n[i]);
  }
  printf("\n<%u>\n", value);
  printf("\n16進数で表現:%08X\n\n", value);

  printf("unionのテスト\n");
  v.bit8.n3 = n[3];
  v.bit8.n2 = n[2];
  v.bit8.n1 = n[1];
  v.bit8.n0 = n[0];
  printf("[%u][%u][%u][%u]\n", v.bit8.n3, v.bit8.n2, v.bit8.n1, v.bit8.n0);
  printf("<%u>\n", v.value);
  return 0;
}

Windows2000sp4/VC++6.0sp5にて動作確認


No.11969

Re:ビット演算のことでご教授お願いしたいのですが。。
投稿者---nop(2004/01/20 12:36:13)


1 つの 32 bit 値を 4 つの 8 bit 値に分割したいのでは?
だから、

1.入力
2.入力チェック
3.分割
4.表示

と言う流れでは?

# そのソースでは「4 つの 8 bit 値を 1 つの 32 bit 値に結合」では?

No.11973

Re:ビット演算のことでご教授お願いしたいのですが。。
投稿者---おでん(2004/01/20 13:56:36)


>1つのunsigned int型変数を8ビットずつ分割して、
>4つの整数(0〜255)を格納、表示できるようにしたいのですが、
・・・(1)
>また、0〜255以外の数字が入力された場合、
>エラーメッセージを出さなくてはなりません。
>
>基本的にscanfで4つの数字を入力して、printfで出力するのですが、
>8ビットずつ区切って1つの変数に入れるという処理がわかりません。
・・・(2)

(1)と(2)は、意味が違うのでは?
(1)→1つの数字(unsigned int:4バイト)の入力をして4つに分割。
(2)→4つの数字を入力してunsigned int(4バイト)にいれる。
また(1)の意味なら、0〜255以外の値が入る事はありません。

・・・・意味が通じません??