掲示板 > Tiny Basic for Windows

ビット演算について

(1/1)

赤崎優輝:
趣味程度にプログラミングをしている赤崎と申します。


まず憶測から話題を始めるのも恐縮ですが、
TBasicで擬似的に乱数を生成するときには
他の言語でも広く用いられている線形合同法を用いていることと思います。
個人的に乱数を用いる機会が多く、コンピューターでの乱数についていろいろ調べてみると、
線形合同法が出力する結果がランダム性の観点から問題点を孕むことや、
乱数生成にはメルセンヌツイスターやXorShift等の手法があることを知りました。


XorShiftは短い処理で高い精度の擬似乱数を得られること、
メルセンヌツイスターは適切なパラメーターを選べば
周期6000桁以上の擬似乱数を得られること。
これらの特徴に惹かれ先日実装を試みました。


前置きが長くなり申し訳ありません。ここからが本題でございます。
先の手法のソースでは、いずれもビット演算が肝になっています。
TBasicにおいてはビット演算はサポートされていないのでしょうか?
ヘルプを熟読しましたが、そのような関数や演算子は見当たらずでした。
ご回答よろしくお願いいたします。


P.S.
現状、擬似的な二進数と擬似的なビットシフト的関数を用意して実行しています。
たとえば(8ビットで)C言語においての y=10,  y^=y>>2 がしたかったら、 
y$="00001010", y$=Left$ (String$(2,"0")+y$, 8) のようにしています。
ソースの見栄えが悪く処理速度にも難ありといった具合で
どうにかしようがないものかと質問をさせていただきました。

takeuchi:
赤崎 様

 投稿有難うございます。

> TBasicで擬似的に乱数を生成するときには
> 他の言語でも広く用いられている線形合同法を用いていることと思います。

実は TBasicでは乱数は内部的に生成はしていません。Delphi のRandom 関数
を呼んでいるだけです。恐らく線形合同法とは思いますが,正確には分かりません。

> TBasicにおいてはビット演算はサポートされていないのでしょうか?
> ヘルプを熟読しましたが、そのような関数や演算子は見当たらずでした。

申し訳ありません。サポートしていません。ご存知の通り,TBasicでの数値は
浮動小数点数のみで整数型はサポートしていませんので,ビット演算は未サポート
です。

実際に2進数に対して,シフト演算を行うには,赤崎様がやっているように

> たとえば(8ビットで)C言語においての y=10,  y^=y>>2 がしたかったら、 
> y$="00001010", y$=Left$ (String$(2,"0")+y$, 8) のようにしています。
> ソースの見栄えが悪く処理速度にも難ありといった具合で

のような方法でやるしかありません。ソースの見栄えについていえば,
RShift$(N$,m) のようなFunction を定義すれば,多少は良くなりますが,
速度についてはどうしようもありません。

申し訳ありません。<m(__)m>

赤崎優輝:
わかりました。
教えていただいたような工夫をしながら使ってみます。
どうもありがとうございました!

Navigation

[0] Message Index

Go to full version