ビットと演算子(&)

3270 ワード

参考:http://www.cnblogs.com/yezhenhan/archive/2012/06/20/2555849.html 演算に参加する二つのデータは、バイナリビットで「と」演算します.
演算規則:0&0=0;0&1=01&0=0;1&1=1;
    :     “1”,    “1”,   0
例えば、3&5は0000 0011&0000 0101=0000 0001ですので、3&5の価値は1です.
また、負の数は補数でビットと演算に参加します.
「与演算」の特殊用途:
(1)クリア.一つのユニットをゼロにしたいなら、たとえそのすべてのバイナリビットが0であっても、一つの皆さんとゼロの数値が合わせれば、結果はゼロになります.
(2)一つの数の中指の位置付けを取る
方法:1つの数を探して、Xの取るべきなビットに対応して、この数の対応するビットは1で、残りのビットは0で、この数はXと“と演算します”を行ってXの中の指定の位を得ることができます.
例:X=10101110を設定し、
 X  4 ,  X & 0000 1111 = 0000 1110     ;

     X 2、4、6 。
ビットまたは演算子
演算に参加する2つのオブジェクトは、バイナリビットで「または」演算します.
演算規則:0|0=0;0|1=11|0=1;1|1=1;
    :               1,   1。
例えば、3|5は0000 0011|0101=0000 0111であるので、3|5は7に値する.
また、負の数は補数でビットまたは演算に参加します.
「または演算」特殊効果:
(1)データのある位置に対してよく使われます.
方法:1つの数を探して、Xに対応して1のビットを置くべきで、この数の対応するビットは1で、残りのビットは0です.この数はX相またはX中のある位置1とすることができる.
例:X=1010000の低い4位置1をX|0000 1111=1010 1111で得ることができます.
異形演算子(^^)
演算に参加する2つのデータは、バイナリビットで「排他的」演算を行います.
演算規則:0^0=0;0^1=1;1^0=1;1^1=0
すなわち、演算に参加する2つのオブジェクトは、2つの対応するビットが「異なる」(値が異なる)なら、そのビットの結果は1であり、そうでなければ0である.
「異形演算」の特殊効果:
(1)特定の位置を反転させて、一つの数を探して、Xに対応して反転させる各位、この数の対応するビットは1で、残りのビットは0で、この数はXと対応するビットが異ならば良いです.
例:X=10101110、Xを低4ビット反転させ、X^0000 1111=1010 0001で得られます.
(2)0とは異なるか、元の値を保持し、X^0000=1010 1110.
上の例文からこの点がよく分かります.
逆演算子(~)を取ります.
演算に参加する1つのデータは、バイナリビットで「反転」演算を行います.
演算規則:~1=0;~0=1;
   :           ,  0 1,1 0。
一つの数の最下位をゼロにして、a&~1と表してもいいです.
1の値は11111111111111111111110です.そして「と」を押して演算します.一番低いのは必ず0です.「」演算子の優先度は、演算子、関係演算子、論理演算子、その他の演算子よりも高いからです.
左の演算子(<
一つの演算対象の各バイナリビットを全部左にいくつかのビットを移動します.左のバイナリビットを破棄し、右に0を追加します.
例:a=a<<2 aのバイナリビットを左に2桁、右に0を補って、
1桁左に移動したらa=a*2です.
左の移動時に捨てる高位が1を含まない場合は、左に1桁ずつ移動します.この数に2を乗じます.
右の演算子(>)
一つの数の各バイナリビットを全部右に若干のビットを移動し、正の数は左に0を補って、負の数は左に1を補って、右に捨てます.
操作数は右に1桁ずつ移動します.この数は2で割るのに相当します.
例えば、a=a>>2はaのバイナリビットを2桁右に移動し、
左は0を補うかそれとも1を補うかを見ます.
演算子は、expression 1のすべての位置を右に移動します.expressition 1のシンボルビットを右に移動した後、左に空いているビットを埋めるために使用します.右に移動したビットは破棄されます.
例えば、下のコードが値を求められた後、tempの値は-4です.
−14(すなわち、バイナリ11110010)の右の2つのビットは−4に等しい(すなわち、バイナリ11100).
vartemp=-14>>2
符号なしで右に移動する演算子(>>)
演算子は、expression 1の各位置を右に移動します.右に移動した後、左に空いているビットを0で埋めます.右の位置を移動したら捨てられます.
例えば:vartemp=-14>>2
変数tempの値は−14(つまり、バイナリの11111111111 11111110010)であり、2ビットを右にシフトした後は1073741820(すなわち、バイナリの0011111 111111111111111111111111111111111111111111111111111111100)に等しい.
複合演算子
ビット演算子は、新しい複合演算子を構成します.
&=例:a&=bはa=a&bに相当します.
124=例:a 124=bはa=a 124 bに相当します.
=例:a>=bはa=a>>bに相当します.
<=例:a<=bはa=a<に相当します.
^=例:a^=bはa=a^bに相当します.
演算規則:前に述べた複合演算子の演算規則と似ています.
長さの異なるデータをビット演算します.
二つの異なる長さのデータがビット演算を行う場合、システムは両者を右端に揃えてビット演算を行います.
「と」演算を例に説明します.C言語では4バイトのlong型が、int型が2バイトを占めています.一つのlong型のデータが一つのint型のデータと「と」演算したら、右端が揃うと、左が不足しているビットは次の3つの状況によって補足されます.
(1)整数データが正数であれば、左に16個の0を補う.
(2)全型データが負の場合、左に16個の1を補う.
(3)整形データが符号なしの場合、左も16個の0を補います.
例えば:long a=123;int b=1;a&bを計算する.
例えば:long a=123;int b=-1;a&bを計算する.
例えば:long a=123;unsigned int b=1;a&bを計算する.