ホームページ >バックエンド開発 >C++ >C++ のビット演算とその応用スキル

C++ のビット演算とその応用スキル

WBOY
WBOYオリジナル
2023-08-22 12:39:171687ブラウズ

C++ のビット演算とその応用スキル

C のビット演算は、プログラマの間でよく使用される演算方法です。ビット演算を使用してデータを処理することにより、一部の複雑な計算タスクをより効率的に実行できます。この記事では、C言語でよく使われるビット演算記号とその応用テクニック、実際の開発で使える例を紹介します。

  1. ビット単位の演算シンボル

C には、バイナリ ビットを演算できる 6 つのビット単位の演算シンボルが用意されています。そのうち 4 つはビット単位の演算子で、他の 2 つはシフト演算子です。ビット単位の演算記号は次のとおりです。

& ビット単位の AND 演算: 両方の 2 進ビットが 1 の場合、結果は 1 になり、それ以外の場合は 0 になります。

| ビット単位の OR 演算: 両方のバイナリ ビットが 0 の場合、結果は 0 になり、それ以外の場合は 1 になります。

#^ ビットごとの XOR 演算: 同じ 2 つのバイナリ ビットの結果は 0 で、異なる結果は 1 です。

~ ビット単位の否定演算: バイナリ ビットを否定します。つまり、0 は 1 になり、1 は 0 になります。

シフト演算の記号は次のとおりです:

右シフト演算: 2 進数を指定された桁数だけ右に移動し、上位ビットを 0 または 1 で埋めます (元の数値が正か負の数値かによって異なります)。 。
    アプリケーション スキル
ビット操作は、低レベルのコンピューター操作で広く使用されており、多くの効率的なアルゴリズムは、いくつかの賢いビット操作テクニックによって実現できます。一般的に使用される手法をいくつか示します。

2.1 パリティの決定

2 進数の場合、最後の桁が 1 の場合、その数値は奇数であり、その逆の場合も同様です。したがって、ビット演算を通じて数値のパリティを決定できます。

任意の整数 n について、n & 1 の結果が 0 の場合、n は偶数であることを意味し、それ以外の場合は奇数です。例:

int n = 5;

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; //右移一位

}

return count;

}

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);

}

応用例

  1. 実際のビット演算開発中のアプリケーションも多数あり、一部の関連タスクはバイト操作を使用することでより効率的に完了できます。例えば、画像処理では、画像の画素を2値化し、上限値と下限値を0と255に設定し、対象となる画素値を0または255に変更することがよくありますが、ビット演算を使用することで効率的な処理を実現できます。コード例は次のとおりです。
for (int i = 0; i C++ のビット演算とその応用スキル
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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。