C のビット演算は、プログラマの間でよく使用される演算方法です。ビット演算を使用してデータを処理することにより、一部の複雑な計算タスクをより効率的に実行できます。この記事では、C言語でよく使われるビット演算記号とその応用テクニック、実際の開発で使える例を紹介します。
C には、バイナリ ビットを演算できる 6 つのビット単位の演算シンボルが用意されています。そのうち 4 つはビット単位の演算子で、他の 2 つはシフト演算子です。ビット単位の演算記号は次のとおりです。
& ビット単位の AND 演算: 両方の 2 進ビットが 1 の場合、結果は 1 になり、それ以外の場合は 0 になります。
| ビット単位の OR 演算: 両方のバイナリ ビットが 0 の場合、結果は 0 になり、それ以外の場合は 1 になります。
#^ ビットごとの XOR 演算: 同じ 2 つのバイナリ ビットの結果は 0 で、異なる結果は 1 です。 ~ ビット単位の否定演算: バイナリ ビットを否定します。つまり、0 は 1 になり、1 は 0 になります。 シフト演算の記号は次のとおりです:右シフト演算: 2 進数を指定された桁数だけ右に移動し、上位ビットを 0 または 1 で埋めます (元の数値が正か負の数値かによって異なります)。 。
if( n & 1 ){
cout << "奇数" << endl;}
else {
cout << "偶数" << endl;}
# # 2.2 2 つの数値の値を交換する
2 つの変数の値を交換するには、3 番目の変数を使用して一方の変数の値を格納し、その値を代入するのが一般的な方法です。他の変数をそれに追加します。ただし、ビット演算を使用する場合、ストレージ用に追加のスペースを使用する必要はなく、ビット XOR 演算を通じて直接実装できます。つまり、
int a = 10, b = 20;
a = a ^ b ;b = b ^ a;
a = a ^ b;
実行後、変数 a の値は 20、変数 b の値は 10、および値2 つの変数は相互に認識され、変化します。
2.3 2 進数の 1 の数
2 進数の 1 の数を計算する場合、& 演算と右シフトを使用して、1 つずつ累積して解くことができます。具体的な実装方法は以下の通りです。
int countOne(unsigned int n){
int count = 0; while (n != 0){
if (n & 1 == 1){ count++; } n = n >> 1; //右移一位
}
2.4 バイナリの i 番目のビットを取得します
左シフト演算を使用して、数値 1 を i - 1 ビットだけ左にシフトできます。 、次にビット単位の AND 演算& を使用して、2 進数の i 番目のビットを取得します。具体的な実装方法は以下の通りです。
bool getBit(unsigned int n, int i){
return (n & (1 << i)) !=0 ;
}
2.5 2進数のi番目のビットを設定します。 to 1
数値 1 を i ビット左にシフトし、この 2 進数と元の数値に対してビットごとの OR 演算を実行して、元の数値の i 番目のビットを 1 に設定します。
unsigned int setBit(unsigned int n, int i){
return n | (1 << i);
}
2.6 2 進数の i 番目のビットを 0
## に設定します# 数値 1 を i ビット左にシフトし、次に 2 進数を反転し、元の数値とビットごとの AND 演算を実行して、元の数値の i 番目のビットを 0 に設定します。 unsigned int clearBit(unsigned int n, int i){return n & ~(1 << i);}
応用例
for (int j = 0; j < img.colnum(); j++){ if (img.at(i,j) < threshold){ img.at(i,j) = 0; //设为0 } else { img.at(i,j) = 255; //设为255 } }}2 進数を操作する、ビットマップ、ハッシュ テーブルなどの多くの効率的なアルゴリズムとデータ構造も実現できます。 つまり、ビット演算は強力なツールであり、プログラミングで広く使用されています。ビット操作のシンボルとテクニックに精通していることは、効率的なアルゴリズムとデータ構造を実装し、プログラムの操作効率を向上させるのに積極的な役割を果たします。
以上がC++ のビット演算とその応用スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。