左右<< >>のC言語 - ビット・コンピューティング

ここで参照が関与する、素敵なビット演算を持つビット・コンピューティングが発生する可能性のある符号質問オーバーフローの問題に対処する方法については。

参考:

1. https://www.cnblogs.com/myblesh/articles/2431806.html

2.のようだ:オリジナルの作者:http://hi.baidu.com/todaygoodhujun/blog/item/b8c10dd15ae4dfd3572c8417.html 

 

 

第1の左は言っすべてのビットがビットの左数に移動される数に左C 用い<< 演算子例えばINT 1 =私は; I = I << 2; // i個のレーン左側の値は2 ビットである1 2 のバンドは、000 ... 0001(ここで正面0 数およびINT のためのビット32 ビットマシン、GCC 、そこ31はTHが0)、2 ビットになった後000 ... 0100 である10 4、左ので、1 を乗じたビット当量2、次いで左




N ビットは、乗算される2 において、N 番目のパワー符号付き数は完全に適用できない左が符号の変化につながる可能性があるため以下の理由を説明する問題があることに留意されたいINT タイプ左端の符号ビットシフトとシフトアウト状況我々はそれを知っているintは、整形手術の符号付き数であり左端の1 ビットは符号ビットでありすなわち0 1 オーバーフローが存在するであろう、シフト例えば; // 16 int型I = 0x40000000からに作られた、4000万のために2 01000000 0000 ... 私は= I << 1; まあ、私は左の1 ビットの後にはなりますが0x80000000、






ある2 100 000 ... 0000は、符号ビットに設定されている1、他のビットが全て0 となるINT 最小タイプで表すことができる32 ビットのint 値があり、-2147483648 オーバーフロー我々場合その後、私は1 起こるどの位置C 言語処理方法の最も高いレベルを捨て使用廃棄いずれかをした後、私は、価値がなる0 が左むしろ特殊なケースに残っています時間シフトは、数値型の最大桁数を超えてコンパイラは、型の最大ビット数を死ぬことを左のビット数が使用されそして私の数だけずらし= I. 1 INT、J =は0x80000000; / / 設定INTがある32 ビット




I = I << 33; // 33 32%= 1
1 ビット、I 2
。J = 33 J <<あり; = 32%1 // 33れる
1 ビット、jはなる0、最上位ビットであるが廃棄GCC このプログラムをコンパイル時間コンパイラが与えられる警告は、左シフト・カウント前記> = 型の長さがさて、実際にI、Jの動きである。1 ビットすなわち33%32 余り後gccのこのルールの下では他のコンパイラは、それが明確ではないが、すべて同じではありません短い左にあるMSB破棄し、0を最下位ビットを埋める右に言って左の真実を理解するために





そう権利がより良く理解される左右逆の概念はすなわち、ビットの適切な数に移動しオペレータは>>。契約と左ビット別に署名する権利それは符号付き整数であるため例の場合はint型のタイプ右符号ビットが変更されないままシフト例えばI = 0x80000000のint型; I = I >> 1; // Iの。値はなりません0x40000000から、しかしなり0xc0000000 あり右に符号ビット移動後正の数、次に補体0、最大負1、すなわち、アセンブラ言語算術右シフトタイプ長さにわたって桁移動が同様とき残りを取るそして次いで残りのビットを移動させる10100110 >> 5 (仮定ワードサイズ8 ビット










    
、その後、取得され  11111101 要約Cの中で左が論理/ 左算術シフト二つの同一)、右算術右シフト不変の符号ビットが残る練習は、いくつかの場合には残されてもよいです/ 右の迅速な乗算を行う/ 除算演算をこれはサイクル効率よりもはるかに高いだろう。  参照:http://hi.baidu.com/todaygoodhujun/blog/item/b8c10dd15ae4dfd3572c8417.html  Cのシフト操作言語、コンテンツあまりありません。しかし、あなたは注意を払っていないいくつかの場所で、それは過失です。  最初に行うために、2つの小さな問題。(1)X-unsigned char型= 3;  X - << 1は、数ですか?X >> 1は数ありますか?(2)X-チャー= 3;  X - << 1は数でありますか?X >> 1は数ありますか?











 

 

  

   

  

   

  (3)X-チャー= -3;  X - << 1は数でありますか?X >> 1は数ありますか?3 進数書き込み00000011を-3 バイナリで書かである補体)11111101   プログラムの実行は、オペレーションコードは、バイナリ値をメモリ内に表されている数値表現です。例えば、プログラムがかかる-3 時間はフェッチう11111101を(1)符号なしの数3 であり、X - << 1 左の、右端のシフト入力ビットゼロオフ左端変位します。なる00000110 、結果は6。X; >> 1。右シフト一方に、それは符号なしであるため、論理右シフト、明確変位右端、ゼロパディングを着信左端のビットシフトとなる00000001 、結果は1 (2)シンボルの数については3 であり、X - << 1 左のいずれかに、右端のシフト入力ビットゼロオフ左端の変位。なります

   

   

 

  

  00000110 、結果があるので、6 ; X - >> 1 右のいずれかにシフトするため、それが署名された数であるので、それが正しい論理、算術右シフトでもある、発生する可能性が発生する可能性があり、Cの標準は、明示的に正しい論理を使用することを指定しませんまたは右に算術シフト。しかし、ほとんどのマシンが右に算術シフトを使用している00000001 、その結果はでした1 しかし、これはマシンのほとんどは、あなたは彼が特別な状況に実行されないことを保証できるようなものであると言うことだけで、注意してください?(3)符号付きの場合-3 言えば、X - << 1 左の、右端のシフト入力ビットゼロオフ左端の変位。なる11111010 、結果は-6 それは符号付き数であるので、右のいずれかに、それが正しい論理を発生する可能性があり、算術右シフトも起こり得ます。ほとんどのマシンが右に算術シフトを使用11111110 、結果は-2   概要:常に左側にゼロをシフトして作ります。数が符号なし右シフトと、ゼロパディングされている場合、この時間は、論理右シフトと呼ばれシンボルの数がシフトアップされるほとんどの場合ながら左端のビット(最上位ビット補数である)、いくつかのシフトいくつかを補うためにこの時間は、算術右と呼ばれます。  印刷メモリのバイト符号化コードを取り付ける:  ボイドPRINT_CHARを(チャーX)  

   

 







  unsigned char型の*のBP =(unsigned char型の*)・X; 

  INTサイズ=さはsizeof(X) 

  (;私はサイズを<I ++はiが0 = INT)のため 

       のprintf( "%2X"、BP [I])。 

  printf( "\ n")を。 

}  

 

おすすめ

転載: www.cnblogs.com/MCSFX/p/11027104.html