C言語の演算子


ビット演算とは、バイナリによる演算です.システムソフトウェアでは、バイナリビットの問題を処理する必要があることが多い.C言語には6個のビット操作演算子が用意されている.これらの演算子は、整数オペランド、すなわち、記号付きまたは記号なしのchar、short、int、longタイプにのみ使用できます.
C言語で提供されるビット演算子のリスト:演算子の意味説明&ビット別と2つの対応するバイナリビットが1の場合、そのビットの結果値は1であり、そうでなければ0|ビット別または2つの対応するバイナリビットのうち1つが1であれば、このビットの結果値が1^ビット別または演算に参加する2つのバイナリビット値が同じであれば0、そうでなければ1~取反~は1元演算子であり、1つのバイナリ数をビット別に取り、0が1になり、1が0<<左にシフトして1つの数の各バイナリビットをすべてNビット左にシフトし、右は0を補います>>右は1つの数の各2進数を右はN位を移動して、右端の低位に移動して捨てられて、記号の数がないことに対して、高位は0を補います
1、「ビット単位と」演算子(&)ビット単位とは、演算に参加する2つのデータを指し、バイナリビット単位で「和」演算を行う.両方の対応するバイナリビットが1の場合、そのビットの結果値は1です.それ以外の場合は0です.ここでの1は論理中のtrueと理解でき,0は論理中のfalseと理解できる.ビット単位は、論理的に「和」の演算規則と一致します.論理的な「与」は、演算数の全真を要求し、結果が真である.もし、A=true、B=trueならば、A∩B=true
例えば、3&5:3のバイナリ符号化は11である.メモリ格納データの基本単位はバイト(Byte)であり、1バイトは8ビット(bit)で構成される.ビットは、コンピュータのデータ量を記述するための最小単位です.バイナリシステムでは、0または1ごとに1ビットです.11を1バイトに足すと、10000001になります.5のバイナリ符号化は101である、これを1バイトに足すと、00000101のビットアンド演算:0000011&00000101 00001であることから、3&5=1 c言語コード:#include main() { int a=3; int b = 5; printf("%d",a&b); } ビットごとの用途:(1)ゼロをクリアしたい場合(すべてのバイナリビットを0にする)、バイナリ数を探して、各ビットが条件を満たします.
元の数の中で1のビットで、新しい数の中で相応のビットは0です.そして両者を&演算することで、クリアの目的を達成することができます.例:元の数は43、すなわち001010111で、もう1つの数を探して、148、すなわち10010100に設定して、両者をビットと演算します:0010111&10010100億円(2)1つの数の中のいくつかの指定ビットを取って、もし1つの整数a(2 byte)があれば、その中の低バイトを取りたいならば、aと8つの1をビットとすればいいだけです.a 00101100 101100&b 00000000 11111111 c 00000000 10101100(3)指定されたビットを保持する:1つの数と「ビット単位」演算を行い、この数はそのビットで1をとる.例えば、84、すなわち01010100があり、そのうち左から3番目、4、5、7番目、8ビットを保持したい場合は、01010100&0011011,000,000,000,000 2、「ビット別または」演算子(|)の2つの対応するバイナリビットのうち1つが1であれば、そのビットの結果値は1である.例えば、60(8)|17(8)は、8進60と8進17とをビット単位または演算する.0011000|00001111 0011111 c言語ソースコード:#include main() { int a=060; int b = 017; printf("%d",a|b); } ≪適用|Apply|emdw≫:ビットまたは演算によって、1つのデータのビット値を1にするためによく使用されます.例えば、1つの数aの下位4ビットを1に変更するには、aと00001111をビット単位または演算するだけでよい.
3、2つの値を交換して、一時変数を使わないで、例えば:a=3;b=4 aとbの値を交換したい場合は、a=a∧bと、a=a∧bと、a=a∧bと、a=a∧bと、a=a∧bと、a    b=b∧a;     a=a∧b; c言語ソース:#include main() { int a=3; int b = 4; a=a^b; b=b^a; a=a^b; printf("a=%d b=%d",a,b); }
4、「取反」演算子(~)一元演算子は、整数を求めるバイナリ逆符号、すなわち、オペランドの各バイナリビット上の1をそれぞれ0、0を1とするために用いられる.5、左シフト演算子(<<)
左シフト演算子は、1つの数の各バイナリビットをいくつか左にシフトするために使用され、移動するビット数は右オペランドで指定され(右オペランドは非負の値でなければならない)、その右側に空いているビットは0で埋められ、高位左シフトオーバーフローはその高位を捨てる.例えば,aの2進数を左に2ビットシフトし,右に空けたビットを0,左にあふれたビットを捨てる.
a=15、すなわち00001111の場合、左に2ビットシフトして0011100になる.ソース:#include main() { int a=15; printf("%d",a<<2); } 左シフト1ビットはこの数に2を乗じたものに相当し、左シフト2ビットはこの数に2*2=4を乗じたものに相当し、15<<2=60、すなわち4を乗じたものに相当する.
しかし,この結論は,この数が左シフトしたときにオーバーフローして捨てられた高位に1が含まれていない場合にのみ適用される.整数を1バイト(8ビット)で格納し、aが符号なし整数変数の場合、a=64の場合、1ビット左シフト時にオーバーフローするのは0
を選択し、2ビット左に移動すると、オーバーフローの上位に1が含まれます.
6、右シフト演算子(>>)右シフト演算子は、1つの数の各バイナリビットをいくつか右シフトするために使用され、シフトしたビット数は右オペランドで指定され(右オペランドは非負の値でなければならない)、右端にシフトした低位は捨てられ、符号数がない場合、高位は0を補う.符号数がある場合、一部のマシンは左に空いている部分を符号ビットで埋めます(すなわち「算術シフト」)、他のマシンは左に空いている部分を0で埋めます(すなわち「論理シフト」).
注意:符号数なしで、右に移動すると左の高位が0に移動します.記号のある値の場合、元の記号ビットが0(この数が正)の場合、左側も0に移動します.シンボルビットが元々1(すなわち負)の場合、左に0または1を移動するかは、使用するコンピュータシステムに依存します.0に移行するシステムもあれば、1に移行するシステムもあります.0に移動するのは「論理シフト」と呼ばれ、すなわち単純シフトである.移入1を「算術シフト」と呼ぶ.例:
a:1001011111101(バイナリ形式で表す)a>>1:0101111110110(論理右シフト時)a>>1:1100101111110110(算術右シフト時)TurboCと他のCコンパイルでは算術右シフト、すなわち符号数右シフト時、符号ビットが元々1であれば、左シフトが上位にシフトするのは1である.7、ビット演算代入演算子
ビット演算子と代入演算子は、複合代入演算子を構成します.例えば:&=,|=,>>=,<<=,∧=例:a&=bはa=a&b a<=2はa=a<<2演算子優先度テーブルに相当する
http://www.slyar.com/blog/c-operator-priority.html
例:2011連発科筆記試験問題
#include <stdio.h>

int main()
{
	int a = 9, b = 7, c = 3;
	int res = a ^ b << 3;
	printf("%d
", res); return 0; }

シフト<<優先度がイソOR^より高いので、
res  =  a ^ ( b << 3 ); resは49に等しい