• 締切済み

リングバッファについて

最近学び出した初心者なのですがリングバッファの空きサイズと使用サイズをそれぞれ1つの式で出したいのですが教えていただけないえしょうか。 (wp-rp)&(bufsize-1)というのを聞いたのですがこれだとバッファサイズが2の累乗サイズじゃないとだめみたいで。どなたかおしえてください

みんなの回答

回答No.7

リングバッファに複数同時にアクセスすることが無いのであれば、 使用サイズの初期値 0 空きサイズの初期値 bufsize 使用サイズは ライトのときにインクリメント リードのときにデクリメント 空きサイズはその逆 だけで管理できます。 これが最も低コストだと思います。 ライトのタイミング、リードのタイミングは 開示されていないのでしょうか?

  • usatan2
  • ベストアンサー率37% (163/436)
回答No.6

No3です。まだ解決しないんですか? 質問者さんは、「分岐命令不可という制約条件で計算したい」ということでしょうか? 加減乗除だけでは、ちょっと思いつきません。 割り算はOKですよね。 なら、 使用サイズ = (wp+bufsize-rp)%bufsize 空きサイズ = (rp+bufsize-wp)%bufsize -1 あたりですかね。最後の -1 は適当です。

回答No.5

No.2です。 結局、求めているものは何ですか? ここはC言語のカテなので、それが明確化されないとC言語の処理例が提示されるだけですよ? 文章でのやり取りですから、「思っている」ことを文章に書き出せなければ相手には伝わりません。 こういうのを期待しているのですか? ------------ 読み出し位置を「rp」、次書き込みを「wp」、バッファの大きさを「size」と定義する。 使用サイズは ・rp=wpの場合「0」 ・rp<wpの場合「wp-rp」 ・rp>wpの場合「(size+wp)-rp」 で求められる。 空き容量は、「size-使用サイズ」で算出される。 ------------ ということで No.3 >できればC言語の概念ではなく+-アンド、オアなどの演算子で出したいのですがご存知でないでしょうか? No.3氏の回答はC言語の「演算子」で記述されています。 No.4 >?などの判定をなしでということです すでにNo.2で回答していますが、提示情報のリングバッファでは判定なしでは算出できません。 算出せずに求めるとすれば、別に「空きサイズ」と「使用サイズ」を管理する変数を用意し、バッファのIN/OUTで同時に増減させることです。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>C言語の概念ではなく+-アンド、オアなどの演算子で出したい 「+-アンド、オアなどの演算子」は(質問者さんがおっしゃるところの) C言語の概念に属しています。 したがって、上記の要求にお応えすることはできないです。

silv_001
質問者

補足

?などの判定をなしでということです

  • usatan2
  • ベストアンサー率37% (163/436)
回答No.3

>それぞれ1つの式で出したい 質問者さんの望むのは 使用サイズ = (wp>rp)? rp-wp: rp+bufsize - wp; 空きサイズ = (rp>wp)? wp-rp: wp+bufsize - rp; のような計算式のことかしら? 適当に書いたので、間違っていると思いますが・・

silv_001
質問者

補足

回答ありがとうございます。 それぞれ使用サイズ、空きサイズを出したいということであっています。できればC言語の概念ではなく+-アンド、オアなどの演算子で出したいのですがご存知でないでしょうか?

回答No.2

>空きサイズと使用サイズをそれぞれ1つの式 この「それぞれ」というのは? 空きサイズ、もしくは使用サイズのどちらかを算出すれば、必然的に 全体のサイズから算出した値を引けばもう一方も算出できますよ。 リングバッファの概念上、常に「wp>rp」は成り立たないので >(wp-rp)&(bufsize-1) の「wp-rp」だけでは欲しい値は求められませんよ。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

bufsize が 2のべきのときに, x&(bufsize-1) という演算には 2つの意味があります. 1つは「bufsize-1 とビットごとのアンドを計算する」, もう 1つは「bufsize で割った余りを求める (厳密にはちと微妙)」です.

silv_001
質問者

補足

そうだったんですか、なにもしらずに使っていました;