こんばんは。
配列に4桁の2進数を無作為に20個格納したいのですが、数値定数には8,16,10進数しか用意されていないため2進数の表し方がわかりません。
現状では、整数列(10進数)を無作為に生成し配列に格納し表示するところまでは出来ました。
どのようにすればよいのか教えて下さい。
10進数→2進数(4桁)への変換
Re: 10進数→2進数(4桁)への変換
こんな感じ?
#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 10進数→2進数(4桁)への変換
無駄に浮動小数点数やpow関数を使うのには反対です。box さんが書きました:こんな感じ?
#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で殴ればいい!(死亡フラグ)
Re: 10進数→2進数(4桁)への変換
#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;
}
#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;
}
Re: 10進数→2進数(4桁)への変換
C言語の数値データには8, 16, 10進数などの区別はなく、全てビット列で表されます。kaovines さんが書きました:こ配列に4桁の2進数を無作為に20個格納したいのですが、数値定数には8,16,10進数しか用意されていないため2進数の表し方がわかりません。
現状では、整数列(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で殴ればいい!(死亡フラグ)
Re: 10進数→2進数(4桁)への変換
ということなので、数値を取得してから2進数に変換する処理を入れたバージョンもどうぞ。kaovines さんが書きました:10進数→2進数(4桁)への変換
#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で殴ればいい!(死亡フラグ)
Re: 10進数→2進数(4桁)への変換
お三方、回答有り難うございます。
10進数から2進数に変換するにも色々なやり方があるんですね。
1.無作為な整数列を2で割ることで0,1の数字のみにする
2.10進数を作り出し2進数に変換
3.あらかじめ16通りの2進数を用意しておく
だいたいこんな感じでしょうか。みけCATさんのがすごく分かりやすかったです。
ありがとうざいました。
10進数から2進数に変換するにも色々なやり方があるんですね。
1.無作為な整数列を2で割ることで0,1の数字のみにする
2.10進数を作り出し2進数に変換
3.あらかじめ16通りの2進数を用意しておく
だいたいこんな感じでしょうか。みけCATさんのがすごく分かりやすかったです。
ありがとうざいました。
Re: 10進数→2進数(4桁)への変換
#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;
}
が入っている、と思っている人がいるでしょう。
それは大きな間違いです。
どの変数にも 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;
}
x / 2 は x >> 1、x % 2 は x & 1、と書けるのです。
Re: 10進数→2進数(4桁)への変換
x が負の数の場合、x/2 と x>>1 が異なることがあるのには注意が必要です。かずま さんが書きました:x / 2 は x >> 1、x % 2 は x & 1、と書けるのです。
Re: 10進数→2進数(4桁)への変換
出力の際の表記を10進数や16進数にしてるだけで内部の処理はすべて2進数で行われているということですね。
頭に入れておきます。
頭に入れておきます。