C言語シフト


1.取反
   
   
   
   
  1. #include   
  2. int main(void)  
  3. {  
  4.     int a=077;  
  5.     printf("%d
    "
    ,a);  //63 16  
  6.     printf("%d
    "
    ,~a); //-64   -17   
  7.     return 0;  

解答:8進数77、10進数63に対応して、それはメモリの中で保存するのは:0011 1111で、それに対して逆を取った後に:1100,000で、コンピュータのメモリの中で、1の冒頭の2進数は負数で、それの対応する10進数は:記号の位を維持して不変で、その他の数は逆を取って1:1100,000をプラスして、:-64です.
2.シフトC言語におけるシフト操作は、内容が多くない.しかし、注意しないところもあるので、油断してしまいました.まず2つの小題をします.    (1)unsigned char x=3; x<<1はいくらですか?x>>1はいくらですか?    (2)char x=3; x<<1はいくらですか?x>>1はいくらですか?    (3)char x=-3; x<<1はいくらですか?x>>1はいくらですか?3は2進数で000000011と書かれています.-3をバイナリ数として書くのは(符号化)11111101です.プログラムが実行されると,操作は数値の符号化表現,すなわちメモリにおける数値のバイナリ表現である.例えば、プログラムが-3を取るときは、11111101を取りに行きます.(1)符号なし数3では,x<<1が左にシフトし,最も左のシフトが外れ,最も右のシフトが入ってきたビットがゼロになる.00000110になったので、結果は6でした.x>>1を右にシフトし、符号数がないため論理的に右にシフトし、最も右にシフトして、最も左にシフトしたビットがゼロになり、00000001になるので、結果は1です.(2)符号数3がある場合,x<<1が左に1ビットシフトし,最も左のシフトが外れ,最も右のシフトが入ってきたビットがゼロになる.00000110になったので、結果は6でした.x>>1を右にシフトすると、符号数があるため論理右シフトが発生する可能性があり、算術右シフトが発生する可能性があるという点で、C規格では論理右シフトを使用するか算術右シフトを使用するかを明確に指定していない.しかし、多くの機械は算術を使って右に移動し、1億円になったため、結果は1だった.しかし、これは多くの機械がそうであることを言っているだけで、あなたは自分が特別な状況に遭遇しないことを保証することができますか?(3)符号数−3がある場合,x<<1が左に1ビットシフトし,最も左のシフトが外れ,最も右のシフトが入ったビットがゼロになる.11111010になり、結果は-6になります.1ビット右にシフトすると、シンボル数があるため、論理右シフトが発生したり、算術右シフトが発生したりする可能性があります.ほとんどの機械は算術を用いて右に移動し,11111110になり,結果は−2であった.まとめ:左シフトでは常にシフトとゼロ補正が行われます.右シフト時の符号なし数はシフトとゼロ補正であり、この場合を論理右シフトと呼ぶ.符号数がある場合は、シフトと一番左のビット(つまり最大有効ビットを補う)を補うことが多く、シフト数ビットを数ビット補う場合は算術右シフトと呼ばれます.印刷メモリにバイト符号化されたコードを添付します.
   
   
   
   
  1. void print_char(char x)
  2. {
  3. unsigned char * bp=(unsigned char *)&x;
  4. int size=sizeof(x);
  5. for(int i=0; i
  6. printf("%.2x", bp[i]);
  7. printf("
    "
    );
  8. }

 
   
   
   
   
  1. #include   
  2.  
  3. int main(void)  
  4. {  
  5.     char a=195;  //  :1100 0011  
  6.     char b=0;  
  7.     b=(a<<2);   // "< 
  8.     printf("%d
    "
    ,b);  // :0000 1100,  12  
  9.     return 0;  

C言語における循環シフトを実現するC言語には循環シフトを提供するオペレータはないが、簡潔な方法で循環シフトを実現することができ、この非常に簡単なマクロは、Cで循環シフトを実現することができる.他の言語も参考にできます.
   
   
   
   
  1. #define ROTATE_LEFT(x, n) ((x) <> ((8 * sizeof(x)) - (n)))   
  2. #define ROTATE_RIGHT(x, n) ((x) >> (n)) | ((x) < 

C言語におけるシフト記号:「<>」では,ループシフトは実現できない.例えば、a=0 x 45サイクルを2ビット左にシフトする.aサイクル左シフトnビットは、元の右(8−n)ビットをnビット左シフトし、元の左端のnを最右nビットにシフトする.    1. aの左端のnビットをbの高いnビットのb=>>(8-n)に先に置く.    2. aをnビット左にシフト、その右面高nビットが0 c=<3となる.b,cをa=c|bとする.手順は次のとおりです.
   
   
   
   
  1. main()  
  2. {  
  3.     unsigned char a=0x45,b,c;  
  4.     unsigned int n=2;  
  5.     b=a>>(8-n)  
  6.     c=a<
  7.     a=c|b;