
最近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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
演算について
-
O(n log n)について2
-
c languageで 簡単な質問があ...
-
C言語でセルオートマトンを作成...
-
2進数の0.2?
-
計算の丸め誤差の解消について
-
2の補数について
-
VBAでの割り算の余りの求め方
-
floatの有効桁数
-
2進数データのビット演算
-
C言語プログラミングにて、arct...
-
このC言語プログラムでどこをい...
-
EXCELの関数"STDEV(標準偏差)"...
-
2038年問題 日付算出
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelでPC(パソコン)によって...
-
データ型 double の桁数について
-
「Aに対するBの割合」と「Aに対...
-
複数桁10進数の*桁目だけを抽出...
-
fgetsなどのときのstdinのバッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
三菱シーケンサ(Aシリーズ)で...
-
ExcelでPC(パソコン)によって...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
VBAでミリ秒まで出力する方法
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
floatの有効桁数
-
除算を使わずに10で割りたい。
-
計算の丸め誤差の解消について
-
VB6.0での小数点の扱いについて
-
コンピューターは指数関数をど...
-
2038年問題 日付算出
-
時刻の比較
-
2進数、16進数、10進数のことを...
-
浮動小数演算は実行環境の変化...
-
2進数の足し算(C言語)
おすすめ情報