
最近C言語の勉強を始めた学生です。
講義中の課題で「セルオートマトン(ルール90)を作成する」というものがありました。
セルオートマトンについて・どのようなものを作るのかはわかったのですが、”次の世代を作るための計算”の部分をどのようにすれば良いのかわかりません。
ヒントとして、シフト演算を使って…と言われたのですが、なぜシフト演算が必要なのかもわからず…
昔から計算が苦手で、わからないのが歯がゆいです。
どなたか解説して頂けませんでしょうか?
ソースコードのみや、それらが載っている書籍の紹介でも構いません。
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
たとえば1次元セルオートマトンの計算をするときに、セル位置0の状態計算を行ったあとで、セル位置1の計算を行うことにします。
セル位置1の計算はセル位置0の計算と同じですから、1次元セルをシフトすることで位置1のセルは位置0にくることになり、位置0について同じ計算を行えば良いことになります。同様にセル位置2の計算を行うには、さらにシフトすれば、位置2のものが位置0に来ますから、その繰り返しで1次元セル全体の計算を行うことができます。
そんなところからシフト演算を使うことをヒントとして挙げているのではないかと。
外している可能性もあるので、詳しいことは、お使いの教科書を読み返してみるか、先生の質問したほうが手っ取り早いと思います。
No.3
- 回答日時:
解説やソースをお求めとのことなので、シフト演算を使わずになるべく平易に書いてみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_data(char *data, char len)
{
int i;
for(i=0; i<len; i++){
if(data[i] == 0)
printf("□");
else
printf("■");
}
printf("\n");
}
void step(char *data, char len)
{
int i;
char rule[8][3] = {
{1,1,1},
{1,1,0},
{1,0,1},
{1,0,0},
{0,1,1},
{0,1,0},
{0,0,1},
{0,0,0}
};
char value[] = {0,1,0,1,1,0,1,0};
char *result = malloc(len);
for(i=1; i<len-1; i++){
int j;
for(j=0; j<8; j++){
if(memcmp(rule[j], &data[i-1], 3) == 0)
break;
}
result[i] = value[j];
}
memcpy(data, result, len);
free(result);
}
#define WIDTH 80
#define HEIGHT 40
int main(int argc, const char *argv[])
{
char data[WIDTH] = {0};
data[WIDTH/2] = 1;
int len = sizeof(data);
int i;
for(i=0; i<HEIGHT; i++){
print_data(data, len);
step(data, len);
}
return 0;
}
パターン比較の処理をメモリ節約しようとしたときに、以下の様な感じで
ビットシフト使うことも考えられます。
rule[] = {7, 6, 5, 4, 3 , 2, 1, 0};
int tmp = (data[i-1] << 2) + (data[i] << 1) + data[i+1];
for(j=0; j<8; j++)
if(rule[j] = tmp)
break;
result[i] = value[j];
ちょっと見当違いかもしれませんね。
シンプルでわかりやすいソースコードをありがとうございます!
メモリ節約が目的のビットシフトとは、気付きませんでした。勉強になります。
こちらも参考にして書いてみようと思います!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
有効数字について 以前質問をし...
-
float型の精度(有効桁と実数)...
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
fortranでx=1としても0.9..が入る
-
c languageで 簡単な質問があ...
-
10次の多項式を求めるプログラ...
-
色の判定
-
4096bitを95種類で表現すると何...
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
PICマイコンのアセンブラについて
-
どんな数字を入力してもaverage...
-
CASLIIの質問です。
-
最大50桁の実数の和・差・積を...
-
最早開始時間と最遅完了時刻を...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
strncpyと_tcsncpy_sのヌルの扱...
-
プログラムでの数字につく”f”の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
有効数字について 以前質問をし...
-
c languageで 簡単な質問があ...
-
EXCELの関数"STDEV(標準偏差)"...
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
floatの有効桁数
-
255の2の補数、B'00000001'が-...
-
O(n log n)について2
-
符号誤り率の計算は例題でどの...
-
CRCの計算方法について
-
VB.net Double と...
-
コンピューターは指数関数をど...
-
16進数 加算 減算 C言語
-
ExcelのINT関数の計算結果がお...
-
C言語でセルオートマトンを作成...
-
BCD・HEX・BINについて
-
”/”を使わずに割り算したいんで...
-
三角比の俯角の計算
-
除算を使わずに10で割りたい。
-
VBAでミリ秒まで出力する方法
おすすめ情報