黒馬プログラマー----C言語学習ノートの位演算子

2417 ワード

---Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング------
ビット演算子
一、紹介
ビット演算とは、バイナリによる演算です.C言語には6種類のビット操作演算子が用意されており、これらの演算子は整数型のデータのみに使用できます.つまり、char、short、long、intなど、記号付きと記号なし
二、ビット演算子
バイナリ間の演算
1.&ビットと
例:9&4
すなわち0000 1001
 &  0000 0100
 --------------
 
0000 0000
printf("%d",9&4);//印刷結果:0
2.|ビット単位または
例:9|4
すなわち0000 1001
 |  0000 0100
 --------------
 
0000 1101
printf("%d",9|4);//印刷結果:11
3.~位によって逆をとる
例:~4
すなわち
 ~  0000 0100
 --------------
 
1111 1011補----->1111 1010反-->1000 0101原=[-5]
printf("%d",~4);//印刷結果:-5
4.>>右シフト
ルール:各バイナリビットはすべてnビット右にシフトし、低位は捨て、高位はシンボルビットを補う.原数/2^nに相当します.1つの数の正負性は変わりません.
例えば8>>2=2
5.<<左シフト
ルール:各バイナリビットはすべてnビット左にシフトし、高位は捨て、低位は0を補う.原数*2^nに相当
例えば、2<<3
0000 0010左シフトは0 0010となり、このとき高位は捨てられ、低位は0を補い、結果として0 0010 000=(0001 0000)2=(16)10となる
致命的な問題:左に移動すると数の正負性が変わる可能性があります
6.^ビット別または
計算ルール:同じ0、異なる1
例:9^4
すなわち0000 1001
  ^ 0000 0100
 --------------
    0000 1101 ---> 13
printf("%d",9^4);//印刷結果:13
二、使い方
1.&a.任意の数と1の和演算は、その数の最下位ビットをとる.ある数の特定のビットを取得するように進化することができます
例えば9&1=1
b.ある数のn番目の位置を0にする
9の3番目の位置を0にすると、9&7------>1001&0111=(0001)2=(1)10
2.使用例
2.1 10進数を2進数で印刷する
	    int num = 8;
	    int len = sizeof(num) * 8;//          
	    int result[len];
	    
	    for (int i = 0; i < len; i++) {
	        result[len - 1 - i ] = num & 1;//      
	        num =  num >> 1;//    
	    }
	    
	    for (int j = 0; j < len; j++) {
	        printf("%d", result[j]);
	    }

 
2.2 1つの数のパリティを判断する
 		    int num = 10;
		    int n = num & 1;//    
		    
		    if(n){
		        printf("  ");
		    }else{
		        printf("  ");
		    }

2.3他の中間値を使用しない--2つの変数の値を交換する
シナリオ1
 	    int a = 3, b = 5;
	    a = a + b;
	    b = a - b;
	    a = a - b;
	    printf("a = %d, b = %d
",a, b);

印刷結果:a=5,b=3
隠れた危険:2つの数が大きいと、オーバーフローします.
シナリオ2
	    int a = 4, b = 5;
	    a = a ^ b;
	    b = a ^ b;
	    a = a ^ b;
	    printf("a = %d, b = %d
",a, b);

印刷結果:a=5,b=4