ビット演算とその応用詳細


このブログは
一.論理演算子1.&ビットと演算1)演算規則ビットと演算の本質は,演算に関与する2つのデータを,対応するバイナリ数でビット毎に論理と演算することである.例えば、int型定数4および7によるビットアンド演算の演算過程は、4=0000 0000 0000 0100&7=0000 0000 0000 0111=0000 0000 0100が負の数に対してその補符号で演算される.例えば、int型定数−4および7のビットと演算の演算過程は、−4=111,111,111,111,111,1100&7=0,000,000,000,000,0111=0,000,000,000,000,000,000,000,000,0100 2の典型的なアプリケーション(1)ゼロクリア:あるデータユニットのデータをすばやくクリアし、そのすべての2進数ビットを0にする.例えば、整数a=321の全データをクリアする動作は、a=a&0 x 0である.321=0000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,例えば整数a=の低8ビットデータを得る動作はa=a&0 xFFである.321=0000 0001 0100 0001&0 xFF=0000,1111=0000,0100,0001整数a=の上位8ビットデータを得る動作は、a=a&0 xFF 00である.a&0 XFF 00==321=0000 0001 0100 0001&0 XFF 00=1111 0000 0000=0000 0001 0000(3)データ領域の特定ビット保持データ領域の特定ビット保持.例えば、整数a=の7-8ビット目(0から)のビットを得るデータ動作は、11000000 321=0000,0001,0100,0001&384=0000,0001,000,000,000,000,000,000,000,000,000,000 2.ビットまたは演算1)演算ルールビットまたは演算の本質は、演算に関与する2つのデータを、対応するバイナリ数でビット毎に論理または演算することである.例えば、int型定数5と7がビットまたは演算を行う式は5|7であり、結果として5=0000 0000 0000 0101|7=0000 0000 0111=0000 0000 0111=0000 0000 0000 0111 2)主な用途(1)が1つのデータの指定ビットを設定する.例えば整数a=321であり、8ビット低いデータを1にする動作はa=a|0 XFFである.321=0000 0001 0100 0001|0000 0000 1111 1111=0000 0000 1111 1111論理演算子|ビットまたは演算子|との区別条件"または"演算子(|)はboolオペランドの論理"または"演算を実行するが、必要に応じて2番目のオペランドを計算する.x‖y,x|yが異なるのは、xがtrueである場合、yは計算されない(yがなぜ値であるかにかかわらず、「または」動作の結果はtrueであるため).これを「ショート」計算と呼ぶ.3.^ビット異または1)演算規則ビット異または演算の本質は、演算に関与する2つのデータを、対応するバイナリ数でビット毎に論理異または演算することである.対応ビットのバイナリ数が反発する場合にのみ,対応ビットの結果が真である.例えば、int型定数5と7のビット異和演算の式は5^7であり、結果は以下の通りである:5=0000 0000 0101^7=0000 0000 0111=0000 0000 0000 0010 2)典型的なアプリケーション(1)位置決め反転位置決め反転位置決め反転:データの指定ビットを設定し、1を0、0を1に変更する.例えば整数数a=321であり、8ビット低いデータを反転させる操作はa=a^0 XFFである.(2)数値交換数値交換.例えばa=3,b=4である.例11−1では、3番目の変数を導入する必要がなく、ビット演算によりデータ交換を実現することができる.以下の操作はa,bの2つのデータの交換を実現することができる:a=a^b;b=b^a; a=a^b; 4.~ビット非ビット非演算の本質は、演算に関与する2つのデータを、対応するバイナリ数でビット毎に論理非演算することである.
二.シフト演算子1.ビット左シフト左シフト演算の本質は、対応するデータのバイナリ値をビット毎に数ビット左シフトし、空き位置に0を記入し、最高位オーバーフローして捨てることである.例えばint a,b;a=5; b=a<<2; b=20であり、分析過程は以下の通りである:(a)10=(5)10=(0000 0000 0000 0101)2 b=a<<2;b=(0000 0000 0001 0100)2=(20)10ビット演算は、前述の例から2倍乗演算が可能であることがわかる.シフト操作の演算速度は乗算の演算速度よりはるかに高いためである.従って、データの乗算を処理する際に、シフト演算を用いることで、より速い速度を得ることができる.ヒント2対2のすべての乗算をシフト演算に変換することで、プログラムの実行効率を向上させることができる2.ビット右シフト右シフト演算の実質は、対応するデータのバイナリ値をビット毎に数ビット右シフトし、境界の数字を捨てることである.現在の数が符号なしの場合、上位はゼロになります.例えばint(a)10=(5)10=(0000 0000 0000 0101)2 b=a>>2;b=(0000 0000 0000 0001)2=(1)10現在のデータが符号数がある場合、右シフトを行う場合、符号ビットによって左に0を補うか1を補うかを決定する.シンボルビットが0の場合、左は0を補う.しかし、符号ビットが1であれば、コンピュータシステムによっては異なる処理方式がある可能性がある.ビット右シフト演算が見られ,対除数2の整除算が実現できる.ヒント2のすべての対2の整数演算をシフト演算に変換すると、プログラムの実行効率が向上する.3.複合のビット演算子はC言語で複合のビット演算子を提供し、以下の通りである:&=、!=、>>=、<=および^=たとえば、a&=0 x 11はa=a&0 x 11に等価であり、他の演算子はこのように推定される.異なるタイプの整数データは、ハイブリッドタイプのビット演算を行う場合、右端揃えの原則で処理し、データ長の大きいデータで処理し、データ長の小さいデータを左端に0または1を補う.例えばchar aとint bがビット演算を行う場合、intで処理し、char aは整数データに変換し、左端に0を補う.補位原則は以下の通りである:1)符号付きデータに対して,aが正の整数であれば左端が0,aが負であれば左端が1を補う.2)符号なしデータの場合:左端に0を補う.4.例11〜2は、符号なしデータのpビットからのnビットバイナリデータを取得する.データの右端が整列すると仮定し,0ビット目のバイナリ数がデータの最右端にあり,得られた結果は右端が整列する必要がある.
#include <stdio.h>
/*getbits: p n  */
unsigned int getbits(unsigned int x, unsigned int p, unsigned n)
{
unsigned int a;
unsigned int b;
a=x>>(p+1);
b=~(~0<<n);
return a&b;
}

ヒントあるプラットフォームでプログラム開発を行う場合、まずこのシステムの基本データ型の有効範囲を理解し、関連するビット演算を評価し、特に境界データを検出し、計算が正しいことを確保することが要求される.