10進数→2進数(4桁)への変換

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

10進数→2進数(4桁)への変換

#1

投稿記事 by kaovines » 9年前

こんばんは。
配列に4桁の2進数を無作為に20個格納したいのですが、数値定数には8,16,10進数しか用意されていないため2進数の表し方がわかりません。
現状では、整数列(10進数)を無作為に生成し配列に格納し表示するところまでは出来ました。
どのようにすればよいのか教えて下さい。

コード:

 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARR_MAX 20

 int main(void)
{

	 int max = ARR_MAX;
	 int arr[ARR_MAX];
	 int i;

	 srand( (int)time(NULL));

	 for(i = 0; i < max; i++){
		 arr[i] = rand();
	 }

	 for(i = 0; i < max; i++){
		 printf("arr[%d]=%d\n", i, arr[i]);
	 }

	 return 0;
 }


box
記事: 2002
登録日時: 14年前

Re: 10進数→2進数(4桁)への変換

#2

投稿記事 by box » 9年前

こんな感じ?

コード:

#include <stdio.h>
#include <math.h>
#include <time.h>

#define ARR_MAX (20)
#define KETA (4)

void convertDecToBin(int *dec, char (*bin)[KETA + 1])
{
    int i, j, t;

    for (i = 0; i < ARR_MAX; i++) {
        for (t = dec[i], j = KETA - 1; j >= 0; j--) {
            bin[i][j] = t % 2 + '0', t /= 2;
        }
        bin[i][KETA] = '\0';
    }
}

void printData(int *dec, char (*bin)[KETA + 1])
{
    int i;

    printf("decimal binary\n");
    for (i = 0; i < ARR_MAX; i++) {
        printf("%7d %6s\n", dec[i], bin[i]);
    }
}

int main(void)
{
    int dec[ARR_MAX], i;
    char bin[ARR_MAX][KETA + 1];

    srand((unsigned int) time(NULL));
    for (i = 0; i < ARR_MAX; i++) {
        dec[i] = rand() % (int) pow(2.0, (double) KETA);
    }
    convertDecToBin(dec, bin);
    printData(dec, bin);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 10進数→2進数(4桁)への変換

#3

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

box さんが書きました:こんな感じ?
無駄に浮動小数点数やpow関数を使うのには反対です。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define ARR_MAX (20)
#define KETA (4)

void convertDecToBin(int *dec, char (*bin)[KETA + 1])
{
    int i, j, t;

    for (i = 0; i < ARR_MAX; i++) {
        for (t = dec[i], j = KETA - 1; j >= 0; j--) {
            bin[i][j] = t % 2 + '0', t /= 2;
        }
        bin[i][KETA] = '\0';
    }
}

void printData(int *dec, char (*bin)[KETA + 1])
{
    int i;

    printf("decimal binary\n");
    for (i = 0; i < ARR_MAX; i++) {
        printf("%7d %6s\n", dec[i], bin[i]);
    }
}

int main(void)
{
    int dec[ARR_MAX], i;
    char bin[ARR_MAX][KETA + 1];

    srand((unsigned int) time(NULL));
    for (i = 0; i < ARR_MAX; i++) {
        dec[i] = rand() % (1 << KETA);
    }
    convertDecToBin(dec, bin);
    printData(dec, bin);
    return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

shuji

Re: 10進数→2進数(4桁)への変換

#4

投稿記事 by shuji » 9年前

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARR_MAX 20

int main(void)
{

int max = ARR_MAX;
int arr[ARR_MAX];
int i;
// 0~0xfまでの値をあらかじめ用意
const int bin[] = {
0, 1, 10, 11,
100, 101, 110, 111,
1000, 1001, 1010, 1011,
1100, 1101, 1110, 1111
};

srand( (int)time(NULL));

for(i = 0; i < max; i++){
arr = bin[rand() & 0xf]; // 下位4ビット(0~15)を取得
}

for(i = 0; i < max; i++){
printf("arr[%d]=%04d\n", i, arr); // %04dで出力
}

return 0;
}

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

Re: 10進数→2進数(4桁)への変換

#5

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

kaovines さんが書きました:こ配列に4桁の2進数を無作為に20個格納したいのですが、数値定数には8,16,10進数しか用意されていないため2進数の表し方がわかりません。
現状では、整数列(10進数)を無作為に生成し配列に格納し表示するところまでは出来ました。
C言語の数値データには8, 16, 10進数などの区別はなく、全てビット列で表されます。
従って、わざわざ「配列に2進数を格納したい」と指定するということは、数値ではなく2進数の文字列を格納したいのであると推測するのが妥当でしょう。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARR_MAX 20
#define DIGIT_NUM 4

int main(void)
{

	int max = ARR_MAX;
	char arr[ARR_MAX][DIGIT_NUM + 1];
	int i, j;

	srand( (int)time(NULL));

	for(i = 0; i < max; i++){
		for (j = 0; j < DIGIT_NUM; j++){
			arr[i][j] = '0' + (rand() % 2);
		}
		arr[i][DIGIT_NUM] = '\0';
	}

	for(i = 0; i < max; i++){
		printf("arr[%d]=%s\n", i, arr[i]);
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 10進数→2進数(4桁)への変換

#6

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

kaovines さんが書きました:10進数→2進数(4桁)への変換
ということなので、数値を取得してから2進数に変換する処理を入れたバージョンもどうぞ。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ARR_MAX 20
#define DIGIT_NUM 4

void num2bin(char *out, int num, int digit_num)
{
	int i;
	for (i = 0; i < digit_num; i++){
		out[i] = '0' + ((num >> (digit_num - 1 - i)) & 1);
	}
	out[digit_num] = '\0';
}

int main(void)
{

	int max = ARR_MAX, value_max = 1 << DIGIT_NUM;
	char arr[ARR_MAX][DIGIT_NUM + 1];
	int i;

	srand( (int)time(NULL));

	for(i = 0; i < max; i++){
		int value = rand() % value_max;
		num2bin(arr[i], value, DIGIT_NUM);
	}

	for(i = 0; i < max; i++){
		printf("arr[%d]=%s\n", i, arr[i]);
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kaovines
記事: 6
登録日時: 9年前

Re: 10進数→2進数(4桁)への変換

#7

投稿記事 by kaovines » 9年前

お三方、回答有り難うございます。
10進数から2進数に変換するにも色々なやり方があるんですね。
1.無作為な整数列を2で割ることで0,1の数字のみにする
2.10進数を作り出し2進数に変換
3.あらかじめ16通りの2進数を用意しておく
だいたいこんな感じでしょうか。みけCATさんのがすごく分かりやすかったです。
ありがとうざいました。

かずま

Re: 10進数→2進数(4桁)への変換

#8

投稿記事 by かずま » 9年前

コード:

#include <stdio.h>

int main(void)
{
    int x, d, o, b;
    x = 0xd;  d = 13;  o = 015;
    printf("%6x %6d %6o\n", x, d, o);
    printf("%#6x %#6d %#6o\n", x, d, o);
    return 0;
}
実行結果

コード:

     d     13     15
   0xd     13    015
これを見て、変数 x には 16進数が、変数 d には 10進数が、変数 o には 8進数
が入っている、と思っている人がいるでしょう。

それは大きな間違いです。
どの変数にも int の内部表現である同じ2進数が入っています。

では、代入時に進数変換が行われたのでしょうか?

いいえ、違います。
0xd はソースプログラム上の 16進表記であり、
13 はソースプログラム上の 10進表記であり、
015 はソースプログラム上の 8進表記であり、
それらは、コンパイル時に内部2進表現に変換され、
それを変数に格納する同じマシン語が生成されます。
コンパイラが進数変換を行っているのです。

そして、プログラムの実行時には、printf が変換指定(%x, %d, %o)に従って、
内部2進表現を、外部16進表現、外部10進表現、外部8進表現に変換しているのです。

ソースプログラム上の定数の 2進表記 (0b1101) がないのと、
printf の変換指定 %b がないことが進数変換の問題を面倒にしています。

この問題のシンプルな解答を書いておきます。

コード:

#include <stdio.h>   // putchar
#include <stdlib.h>  // rand, srand
#include <time.h>    // time

void print_bin(int b, int n)
{
    while (n > 0)
        putchar('0' + (b >> --n & 1));
    putchar('\n');
}

int main(void)
{
    int a[20], i;
    srand(time(0));
    for (i = 0; i < 20; i++)
        a[i] = rand() & 0xf; // 乱数の下位4ビットを格納
    for (i = 0; i < 20; i++)
        print_bin(a[i], 4);  // 4桁の2進出力
    return 0;
}
実行効率の悪い、浮動小数点も、pow() も、整数の割り算も不要です。
x / 2 は x >> 1、x % 2 は x & 1、と書けるのです。

かずま

Re: 10進数→2進数(4桁)への変換

#9

投稿記事 by かずま » 9年前

かずま さんが書きました:x / 2 は x >> 1、x % 2 は x & 1、と書けるのです。
x が負の数の場合、x/2 と x>>1 が異なることがあるのには注意が必要です。

kaovines
記事: 6
登録日時: 9年前

Re: 10進数→2進数(4桁)への変換

#10

投稿記事 by kaovines » 9年前

出力の際の表記を10進数や16進数にしてるだけで内部の処理はすべて2進数で行われているということですね。
頭に入れておきます。

閉鎖

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