0

いくつかの着信/発信ビットをカウントする C のツールに取り組んでいます。バイトに変更してビットを保持し、失わないようにしたいと考えています。

最後に、ダウンロード/アップロードされた xxxxx ビットを表示したいと思います。私は 10GB=85899345920bits に最大値を設定しています。これは、約 35 ビットを表す必要があります。32ビットOSを使用しています。unsigned long と unsigned int を試しましたが、オーバーロードしました。

追加プロセスを取得して精度を維持する簡単な方法はありますか?

4

4 に答える 4

5

少しハイブリッドなアプローチを取ることができます。バイト数を1つの変数に格納し、余分なビット数を別の変数に格納します。POSIXシステムがエポックからの時間を秒マイクロ秒の両方で返す方法と同様です。

       struct timeval {
           time_t      tv_sec;     /* seconds */
           suseconds_t tv_usec;    /* microseconds */
       };

ビットの転送を取得したら1505、以下を保存します。

bytes += (1505/8); // ==188
bits += (1505%8); // ==1

このようにして、ビットを追跡できます。

または、すべての楽しみを引き出して、を使用することもできますlong long

于 2011-02-11T11:48:19.880 に答える
2

MSVC を使用している場合は、__int64 または LONGLONG を使用できます。

それまたは同等のものは、他でサポートされている可能性があります。

そうでない場合は、Joe の回答を使用する必要があると思いますが、必要に応じて、追加の 0 ~ 7 ビットを別の char または int に格納するだけです。他の追加ビットはすべてそのストアに入れ、それが「オーバーフロー」(つまり 8 ビット以上) した場合は、8 を取り除き、バイト カウントに 1 を追加します。

編集:長い長い?

于 2011-02-11T11:39:18.497 に答える
1

1バイトに8ビットがあると仮定すると(多くの場合、これは安全な仮定です!)、バイト数を格納し、それを表示するときに8を掛けることができます。お使いのソフトウェアは、おそらく一度に少なくとも1バイトのバッファを処理しています。

于 2011-02-11T11:32:01.140 に答える
1

uint64_t(から<stdint.h>)は64ビットを提供します。(特定のコンパイラと OS の場合、これは と同じですが、このunsigned long longような固定幅の型を使用することをお勧めしますuint64_t)。

于 2011-02-11T11:57:07.233 に答える