bugfix> c++ > 投稿

StroustrupによるTCPPPLを読んでいます。を抽出する関数の例を示します中間 次のような32ビット長の16ビット:

unsigned short middle(long a){ return (a>>8)&0xffff;}.

私の質問は:それは抽出されていません最終 16ビット?私が間違っている方法を教えてください。

回答 4 件
  • 実際に真ん中の16ビットを抽出します:

    //    a := 0b xxxx xxxx 1111 1111 1111 1111 xxxx xxxx 
    a>>8;   // 0b 0000 0000 xxxx xxxx 1111 1111  1111 1111
    &0xffff // 0b 0000 0000 0000 0000 1111 1111  1111 1111
    
    

  • a >> 8   a の値を右シフトします  8ビットずつ。下位8ビットは忘れられ、以前は31〜8の番号が付けられていたビットが23〜0に移動(番号が付け直され)されます。最後に、上位16ビットをマスクすると、ビット15〜0が残ります。ビット15〜0は元々(シフト前)位置23〜8にありました。出来上がり。

  • aは右に8ビットシフトします( a>>8 )ビット単位および操作の前。

  • >>8 に気づきましたか  部?最初に引数を8ビット右にシフトします。

あなたの答え