C言語復習0.2——ビット演算


C言語復習0.2
ビット演算
Cを使用して変数内の個々のビットを操作できます.人々がそうしたい理由を不思議に思っているかもしれません.この能力は時には確かに必要であるか、少なくとも役に立つ.Cはビットの論理演算子とシフト演算子を提供する.次の例では、ビットに対する操作を理解できるように、バイナリカウント法を使用して値を書き出します.実際のプログラムでは、一般的な形式の整数変数または定数を使用できます.例えば00011001の形式は適用されず、25または031または0 x 19と書く.私たちの例では、左から右に8桁の数字を使用し、各桁の番号は7から0です.
ビット論理演算子
4つのビット演算子はcharを含む整数データに用いられる.これらのビット演算子をビット演算とするのは、左右のビットに影響を及ぼさずに各ビットを操作するためである.これらの演算子を通常の論理演算子(&&、‖および!)と一致させないでください.混同され、通常のビットの論理演算子は値全体を操作します.
位によって逆~をとる
単元演算子~は、1ごとに0、0ごとに1となり、以下のようになります.
    ~(10011010)
    01100101

aがunsigned charであると仮定し、値は2である.バイナリでは、2は0000010である.したがって、−aの値は11111101または253である.この演算子はaの値を変更せず、aは2のままであることに注意してください.
    unsigned char a = 2;   //00000010
    unsigned char b = ~a;  //11111101
    printf("ret = %d
", a); //ret = 2 printf("ret = %d
", b); //ret = 253

ビットアンド(AND):&
バイナリ演算子&2つのオペランドをビット単位で比較することで、新しい値が生成されます.各ビットについては、2つのオペランドの対応するビットが1の場合のみ結果が1になります.
      (10010011) 
    & (00111101) 
    = (00010001)

Cには、ビット対-付与演算子:&=の組合せもあります.次の2つは、同じ結果を生成します.
    val &= 0377
    val = val & 0377

ps:1つの数&1の結果はバイナリの最下位をとることです.これは、整数のパリティを判断するために使用することができ、バイナリの最下位ビットが0であることは偶数であり、最下位ビットが1であることは奇数であることを示す.
ビットまたは(OR):|
バイナリ演算子|は、2つのオペランドをビット単位で比較することによって新しい値を生成します.各ビットについて、任意のオペランドに対応するビットが1である場合、結果ビットは1となる.
       (10010011)
     | (00111101)
     = (10111111)

Cには、コンポジットビットまたは-代入演算子もあります:|=
    val |= 0377
    val = val | 0377

ps:or演算は通常、バイナリ特異的な位置決め上の無条件の付与に用いられ、例えば、1つの数or 1の結果、バイナリ最下位ビットを強制的に1にする.バイナリ最下位を0にする必要がある場合は、この数or 1の後にもう1つ減らせばいいです.
ビットイソOR:^
バイナリ演算子^は、2つのオペランドをビット単位で比較します.各ビットについて、オペランドの対応するビットの1つが1である(いずれも1ではない)場合、結果は1である.いずれも0またはいずれも1である場合、結果ビット0.
       (10010011)
     ^ (00111101)
     = (10101110)

^=言わないで自己脳補
使用法
オープンビットflag|~flag
     (10011010)
    |(01100101)
    =(11111111)

閉鎖ビットflag&~flag
     (10011010)
    &(01100101)
    =(00000000)

転位位flag^0 xff
     (10010011)
    ^(11111111)
    =(01101100)

ふたつの数を入れ替える
//a ^ b = temp;
//a ^ temp = b;
//b ^ temp = a
 (10010011)
^(00100110)
=(10110101)

 (10110101)
^(00100110)
  10010011

シフト演算子
左に移動
左シフト演算子<次の例では、各ビットを左に2つの位置に移動します.
    (10001010) << 2
    (00101000)

左シフト1ビットは元の値*2に相当する.
    1 << 1 = 2;
    2 << 1 = 4;
    4 << 1 = 8;
    8 << 2 = 32

右に移動
右シフト演算子>>左側のオペランドの値を1桁ごとに右に移動し、移動する桁数は右側のオペランドで指定します.左側のオペランドのセグメントを削除したビットを破棄します.unsignedタイプの場合、左端が空いているビットに0を入力します.シンボルタイプの場合、結果はマシンに依存します.空のビットは0で塗りつぶすか、シンボル(左端)のビットのコピーで塗りつぶすことができます.
    //    
    (10001010) >> 2
    (00100010)     //          

    (10001010) >> 2
    (11100010)     //          

    //    
    (10001010) >> 2
    (00100010)    //         

使用法
シフト演算子は、2のべき乗に対する高速で効率的な乗算および除算を提供することができる(ハードウェア依存).
number << n
numberに2を乗じたn乗
number >> n
numberが負でない場合はnumberを2のn乗で割る