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 } }
以上がC++ のビット演算とその応用スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。