3

K&R II C Programming ANSI C book で、">>" および "<<" 演算子がビットを制御することを読みました。パケットを手動で構築する方法を考え出すことに興味を持ち、次のスニペットに出くわしました。

unsigned short csum(unsigned short *buf, int nwords)
{       
        unsigned long sum;
        for(sum=0; nwords>0; nwords--)
                sum += *buf++;
        sum = (sum >> 16) + (sum &0xffff);
        sum += (sum >> 16);
        return (unsigned short)(~sum);
}

これがチェックサムを計算することは知っていますが、ここで何が起こっているのかわかりません。XD

明らかにこれは私のスキルの範囲外ですが、このスニペットをスニペットとして使用して、未回答の質問を解決できると考えました。ビット単位の演算子を使用して特定の値を取得するタイミングはいつわかりますか?足し算 (+) または引き算 (-) だけではどうですか? また、 2 つの演算子がない場合、なぜ の&0xffff横に16 進数があるのですか?sum

PS とは~sumどういう意味ですか?

4

3 に答える 3

1

あなたが話していることはすべて、ビットレベルでの操作に関係しています。たとえば、「var >> num」は、var を num だけ右にシフトします (つまり、var を 2^num で割ります)。また、~var はビットレベルで var を反転します (例: ビット表記で var = 5 の場合 = 101 ----> ~var = 010)。

于 2012-06-05T15:12:26.090 に答える
1

ビット単位の演算子を使用して特定の値を取得するタイミングはいつわかりますか

オブジェクトの個々のビットを操作する必要があり、単純な整数演算では不十分であるか、コードの意図をあまり明確に記述できない場合は、ビットごとの演算子を使用します。

これは簡単に聞こえると思いますが、実際にはそれと同じくらい簡単です。

&0xffffなぜ横に16進数があるのですかsum

&ビットごとの AND 演算子です。この場合、bitmaskを実現するために使用されます。

とは~sumどういう意味ですか?

~はビット単位の逆演算です。各ビットの値を反転します。

これらの演算子のそれぞれについて、C の学習に使用している本で説明されていることを願っています。

于 2012-06-05T15:13:42.073 に答える
1

それは質問ではありません、それはたくさんあります。:)

  1. 数値を整数ではなくビットの集合として表示する場合は、ビットごとの演算子を使用します。数学的に同等の操作を作成するよりも、「このビットパターンを 2 ビット左にシフトしたい」と言う方がはるかに簡単です。それらは概念的に異なります。数値をビットと考える場合は、ビット演算子を使用する方が理にかなっています。
  2. & 0xffff、すべての上位ビットをマスクすることにより、値が 16 ビットであることを確認します。これは、システムunsigned longが少なくとも 16 ビット幅であることを前提としています。これはかなり安全な前提です。( &bitwise AND) は、この目的でよく使用されます。論理積の真理値表を見て、「false は 0、true は 1」と考えて、これがどのように機能するかを確認します。
  3. 16 進数の定数の&前にあるのは C のビットごとの AND 演算子で、これは上で説明したマスキングを行うために使用されます。基本的に、単一ビット変数a & bの場合、結果はとの1両方が 1 である場合に限ります。演算子は、このロジックを入力項のビットの各ペアに適用します。ab
  4. 演算子は Cの~ビットごとの反転であり、引数のビットを「反転」します。マスクの作成によく使用されます。
于 2012-06-05T15:13:51.970 に答える