C言語におけるシフト演算

1969 ワード

へんいえんざん
1.左に移動
//C     
x<

1つのnビットのオペランドxに対して、x<
2.右に移動
//C     
x>>k;

一般に、マシンは2つの形式の右シフト:論理右シフトと算術右シフトをサポートする.論理右シフトは左端にk個の0を補う.算術右シフトは左端にk個の最高有効ビットを補う.
3.一例
Tables
Cool
パラメータx
[01100011]  [10010101]
x << 4
[00110000]  [01010000]
x>>4(論理右シフト)
[00000110]  [00001001]
x>>4(算術右シフト)
[11110110]  [11111001]
 C言語では、どのタイプの右シフトを使用するべきかは明確に定義されていません.
  • 符号なしデータ(unsigned宣言整形オブジェクト)について、右シフトは論理的でなければならない.
  • シンボルデータ(デフォルトで宣言された整数オブジェクト)については、算術的または論理的な右シフトが可能である.しかし、実際には、ほとんどのコンパイラ/マシンの組合せがシンボルデータに対して算術右シフトを使用し、多くのプログラマーもマシンがこの右シフトを使用すると仮定している.

  • 一方,Javaは右シフトをどのように行うかを明確に定義している.式x>>kはx算術をk個の位置に右シフトし、x>>>kはxを論理的に右シフトする.
    シフト操作の注意
    1.変位kビット、kが大きい
    質問:wビットからなるデータ型について、k(k>>w)ビットを移動するとどのような結果が得られますか?たとえば、32ビットのマシンで次の式を計算すると、次の結果が得られます.
    int      lval = 0xFEDCBA98 << 32;
    int      aval = 0xFEDCBA98 >> 46;
    unsigned uval = 0xFEDCBA98 << 40;

      C言語標準は、この場合どうすればいいかを説明することを慎重に回避している.多くの機械では、1つのwビットの値を移動すると、シフト命令はシフト量の低いlog 2 wビットのみを考慮するので、実際の上位シフト量はk mod wを計算することによって得られる.32ビットのマシンで、上の3つのシフト演算はそれぞれ0、4、8ビット移動し、結果を得た.
    lval 0xFEDCBA98
    aval 0xFFEDCBA9
    uval 0x00FEDCBA

    ただし、このような行為はCプログラムにとって保障されていないため、変位数は文字長より小さく維持されるべきである.
    2.シフトに関するオペレータ優先度の問題
    1<<2+3<<4

     C言語では、加算(および減算)の優先度がシフト演算よりも高く、左から右への結合規則に従って、上記の式を説明します.
    (1<

    参考資料
    『コンピュータシステムを深く理解する』第2章情報の表示と処理