0

memset値が1の20バイト(160ビット)のメモリブロックが割り当てられています。各ビットは着信データを表し、データが受信された場合はビットが設定され、それ以外の場合はリセットされます。最初にすべての160ビットを設定しましたが、データが受信されない場合はリセットします。以下はサンプルコードです。

char *buf = malloc(20);
memset(buf,1,20);

recvfun() {
static int index;
index++;
   if(!received)
     *buf = *buf ^ (1<<(160-index));
...
}

* bufは完全なメモリブロックではなく8ビットしか提供しないと思うので、ビットをリセットしようとするたびに、上記のコードは最初の8ビットでのみリセットされます。99番目のデータが受信されないと仮定すると、99番目のビットをリセットする必要があります。これを達成するために私を助けてくれませんか。貴重な時間をありがとうございました。

4

2 に答える 2

4

あなたはそれをバイトインデックスとビットインデックスに分解する必要があります、例えば変更:

if(!received)
  *buf = *buf ^ (1<<(160-index));

に:

if (!received)
{
    const int byte_index = index / CHAR_BIT;
    const int bit_index = index & (1 << CHAR_BIT - 1);
    buf[byte_index] ^= (1 << bit_index);
}

memset(buf,1,20);上記のコードでは、memset(buf,255,20);すべてのビットを1に初期化する必要があることにも注意してください。

于 2012-10-01T11:21:01.747 に答える
3

2つのことを計算する必要があります。

  • ブロック内のインデックス
  • ビットオフセット

それを計算するコードは非常に簡単です。

blockindex = index / 8;
offset     = index % 8;

次に、インデックスとオフセットを組み合わせてビットを設定します。

buf[blockindex] ^= 1 << offset;

編集:私の答えはPaul Rの答えと同じ原理を使用していますが、Paulの答えはハードコーディング8(恥ずべきこと)の代わりに正しい定数(CHAR_BIT)を使用しているため、技術的に優れています。

于 2012-10-01T11:21:33.890 に答える