-3

a <= b <= a+cモジュラス256(の値を取得し、aそれにa+c最も近い)かどうかを簡単に確認するにはどうすればよいbですか?

基本的に私はTCPで見られるのと同じような状況にあります。TCPは、最後に受信したもの( )以上であるが、最後に受信したもの+オフセット( )b以下のシーケンス番号()を受信することを想定しています。問題は、これらすべてがモジュラスで発生することです(TCPの場合はmod 32535、私の場合はmod 256です)。ac

不明な点がある場合は申し訳ありませんが、詳細をお気軽にお問い合わせください。質問を更新します。

4

4 に答える 4

1

これを行うための単純なC関数は次のようになります。

int is_valid (int old_val, int new_val, int offset, int width)
{
  if (new_val <= old_val)
    /* The only way this can happen is if there was wrap-around.
    OR if the `new_val' is invalid. If it is invalid, the next `if'
    will catch it.  */
    new_val += width;

  if (new_val > (old_val + offset))
    return 0;

  return 1;
}

わかりやすく、それが本当に大事なことだと思います。

あなたの場合:offset = 10そしてwidth = 256

警告:

  1. new_val + width入力は、にold_val + offset収まるように十分に小さくする必要がありintます。
  2. old_valnew_valが同じである場合、入力は無効と見なされます。これが希望どおりでない場合は、に変更<=して<ください。
  3. old_valこの関数は、とnew_valがすでにモジュロ幅、つまりモジュロ256であることを前提としています。これは検証されません。

次の入力で実行すると:

int main (void)
{
  printf ("%d\n", is_valid (255, 9, 10, 256)); /* Pass.  */
  printf ("%d\n", is_valid (255, 10, 10, 256)); /* Fail.  */
  printf ("%d\n", is_valid (0, 10, 10, 256)); /* Pass.  */
  printf ("%d\n", is_valid (0, 11, 10, 256)); /* Fail.  */
  printf ("%d\n", is_valid (100, 109, 10, 256)); /* Pass.  */
  printf ("%d\n", is_valid (100, 110, 10, 256)); /* Pass.  */
  printf ("%d\n", is_valid (100, 111, 10, 256)); /* Fail.  */

  return 0;
}

次の出力が得られます。

1
0
1
0
1
1
0
于 2012-07-16T12:23:03.487 に答える
0
template <int N> bool moduloLess (int a, int b)
{
  // this is a group, even after modulo!
  int d=(b+N-a)%N;
  // use the representative in [-N/2-1, N/2] and check whether its greater
  // negative means that b was "smaller"
  // since we got the representative in [0, N-1], check whether we are greater than N/2 
  return d*2 <= N;  
}

私があなたの質問を正しく理解したなら、これはそれをするはずです...

更新された質問の場合:moduloLess<256>(b-a, c)少なくともcが128より小さい場合は、を使用するだけで機能するはずです。

于 2012-07-16T12:06:59.197 に答える
0

ロールオーバーのある単調なカウンターまたはタイマーの場合、が256を法としてa少し大きいかどうかを判断するには、がであるかどうかを確認するだけです。ba - b < 128 (mod 256)

a> bの例:

256 - 206 = 50 (mod 256)
  0 - 206 = 50 (mod 256)
 20 - 226 = 50 (mod 256)

a <bの例:

206 - 256 = 206 (mod 256)
206 -   0 = 206 (mod 256)
226 -  20 = 206 (mod 256)

唯一のトリックは%、Cの演算子が否定的な結果を出す可能性があることです。より良い方法は、1バイト型(unsigned charまたはuint8_t、おそらく)にキャストすることです。

したがって、あなたの場合、テストは次のようになります。

if ((unsigned char)(b - a) < 128 && (unsigned char)(a + c - b) < 128)
于 2012-07-16T12:12:36.633 に答える
0

次のようなマクロを定義します。

#define COMPARE_MODULUS (a,b,c)  ((a)%256) <= ((b) % 256)? ((b) <= ((a)+(c))?true:false):false
于 2012-07-16T12:27:50.330 に答える