dポイントプレゼントキャンペーン実施中!

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

A 回答 (7件)

リングバッファに複数同時にアクセスすることが無いのであれば、


使用サイズの初期値 0
空きサイズの初期値 bufsize
使用サイズは
ライトのときにインクリメント
リードのときにデクリメント
空きサイズはその逆
だけで管理できます。
これが最も低コストだと思います。

ライトのタイミング、リードのタイミングは
開示されていないのでしょうか?
    • good
    • 0

No3です。

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

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で同時に増減させることです。
    • good
    • 0

>C言語の概念ではなく+-アンド、オアなどの演算子で出したい



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

この回答への補足

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

補足日時:2009/11/20 07:39
    • good
    • 0

>それぞれ1つの式で出したい


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

この回答への補足

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

補足日時:2009/11/19 23:14
    • good
    • 0

>空きサイズと使用サイズをそれぞれ1つの式


この「それぞれ」というのは?
空きサイズ、もしくは使用サイズのどちらかを算出すれば、必然的に
全体のサイズから算出した値を引けばもう一方も算出できますよ。

リングバッファの概念上、常に「wp>rp」は成り立たないので
>(wp-rp)&(bufsize-1)
の「wp-rp」だけでは欲しい値は求められませんよ。
    • good
    • 0

bufsize が 2のべきのときに, x&(bufsize-1) という演算には 2つの意味があります. 1つは「bufsize

-1 とビットごとのアンドを計算する」, もう 1つは「bufsize で割った余りを求める (厳密にはちと微妙)」です.

この回答への補足

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

補足日時:2009/11/19 23:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!