投稿者 スレッド: ビット演算について  (Read 2552 times)

赤崎優輝

  • ゲスト
ビット演算について
« 投稿日:: 2017年 3月 01日 , 午後 04:13:20 »
趣味程度にプログラミングをしている赤崎と申します。


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


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


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


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

takeuchi

  • 管理人
  • *****
  • 投稿: 100
Re:ビット演算について
« Reply #1 投稿日:: 2017年 3月 01日 , 午後 06:27:19 »
赤崎 様

 投稿有難うございます。

> 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>

赤崎優輝

  • ゲスト
Re:ビット演算について
« Reply #2 投稿日:: 2017年 3月 12日 , 午前 12:17:56 »
わかりました。
教えていただいたような工夫をしながら使ってみます。
どうもありがとうございました!