最近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で質問しましょう!
似たような質問が見つかりました
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 化学 化学のエンタルピ変化を求め方について ある例題では各物質のモール数を換算して計算することもあり、ある 1 2022/06/20 23:22
- ノートパソコン 大学のレポート作成専用ノートパソコンとして、VAIO SX12(Core i7、32GB、1TB-S 5 2023/06/10 11:14
- C言語・C++・C# C言語で移動平均のプログラムを作りたいのですが、数値をファイルから取ってきて計算をするプログラムはど 1 2022/09/29 01:21
- 経済学 国の予算原則について質問です。 「予算単年度主義」と「会計年度独立の原則」の違いが今ひとつ分かりませ 1 2022/04/08 15:53
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- 統計学 t検定を繰り返してはいけない理由について教えて下さい。 2 2022/05/15 12:37
- その他(コンピューター・テクノロジー) 4勤2休のシフト作成 1 2022/12/15 15:38
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
有効数字について 以前質問をし...
-
c languageで 簡単な質問があ...
-
三菱シーケンサ(Aシリーズ)で...
-
2038年問題 日付算出
-
O(n log n)について2
-
大きすぎる数値になるとE+にな...
-
ExcelでPC(パソコン)によって...
-
16進数 加算 減算 C言語
-
Double型について
-
VBAでミリ秒まで出力する方法
-
C言語でセルオートマトンを作成...
-
n=a&&b==c<d<<eの計算方法
-
2進数データのビット演算
-
VB6.0での小数点の扱いについて
-
1以下になる数値計算
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
VBAでの割り算の余りの求め方
-
double型からfloat型への型変換...
-
2進数の足し算(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.net Double と...
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
有効数字について 以前質問をし...
-
ExcelのINT関数の計算結果がお...
-
三菱シーケンサ(Aシリーズ)で...
-
VBAでミリ秒まで出力する方法
-
16進数 加算 減算 C言語
-
ExcelでPC(パソコン)によって...
-
時刻の比較
-
除算を使わずに10で割りたい。
-
計算の丸め誤差の解消について
-
VB6.0での小数点の扱いについて
-
”/”を使わずに割り算したいんで...
-
EXCELの関数"STDEV(標準偏差)"...
-
BCD・HEX・BINについて
-
2038年問題 日付算出
-
2進数の足し算(C言語)
-
VBAのINT関数について
-
どんな数字を入力してもaverage...
おすすめ情報