C & C++ プログラミングにおけるビット演算子
公開: 2022-12-09RAM では、データは一連のバイトとして編成されます。 各バイトには連続する 8 ビットが含まれます。 C およびC++ のビット演算子は、データのビットに対していくつかの算術演算を実行する場合に役立ちます。 それらは非常に高速で、プログラムの効率を高めるために時々使用されます。 それらは、ビットレベルで操作を実行したり、さまざまな方法でビットを操作したりするビット単位のアルゴリズムで動作します。
C および C++ のビット演算子の型:
- ビット演算 AND
- ビットごとの OR
- ビット単位の NOT
- ビットごとの排他的論理和 (XOR)
- 左シフト演算子
- 右シフト演算子
それぞれの詳細を見てみましょう。
目次
1. ビットごとの AND:
C または C++ のビットごとの AND 演算子は、1 つのアンパサンド (&) を使用します。 オペランドとして 2 つの数値を取り、それらのすべてのビットに対して AND を実行します。 結果は、両方のビットが 1 の場合にのみ 1 になります。いずれかのビットが 0 の場合、結果は 0 になります。基本的に、 C & C++ のこのバイナリ演算子は、指定された 2 つの数値のすべての位置にあるビットの論理 AND を取ります。バイナリ形式。
例:
2 つの数値 a と b の 2 進表現が次のようであるとします。
= 01011000
b = 10111001
したがって、a & b = 00011000
上記の例からわかるように、結果は a と b の両方が 1 である場所でのみ '1' を示します。それ以外の場所では結果はすべて '0' を示します。
2. ビットごとの OR:
C & C++ では、ビットごとの OR はビットごとの AND と非常によく似た働きをします。 唯一の違いは、ビットごとの OR 演算子では、ビットの位置が結果で「1」になるためには、2 つのビットのうちの 1 つだけが「1」である必要があることです。 この演算子は 2 つの数値をオペランドとして取り、2 つの数値のすべてのビットに対して OR を実行します。
次のように動作します。
- 両方のビットが「1」の場合、結果は「1」です。
- 両方のビットが「0」の場合、結果は「0」です。
- いずれかのビットが「1」の場合、結果は「1」です。
これは、最も単純で最も頻繁に使用されるC++ ビット演算子の 1 つです。 その記号はパイプ | です。 さらに、ブール論理演算子 || と同じです。
例:
2 つの数値のバイナリ表現を仮定します。 b は:
= 01101001
b = 10111000
だから、 b = 11111001
3. ビット単位の NOT:
ビット単位の NOT 演算子とも呼ばれ、結果のすべてのビットを反転します。 その記号はチルダ (~) です。 この演算子の動作を覚える簡単な方法は、チルダが時々 twiddle として知られていることと、ビットごとの補数が各ビットを twiddle することです。 つまり、1 があれば結果は 0 になり、その逆も同様です。 つまり、 Cおよび C++のこのビット演算子は、1 つの数値を取り、すべてのビットを反転します。
符号なし数値の可能な最大値を決定する場合、これは最も有用なC++ ビット演算子の 1 つです。
例:
unsigned int num = ~0;
ここで、0 はすべて 0 を意味します: 00000000. したがって、ビット単位の NOT 演算子を実装すると、結果は 1 になります: 11111111. num は unsigned int であるため、符号ビットまたは 2 の補数について心配する必要はありません。 1 は、結果で可能な最大数です。
ビット単位の NOT 演算子の重要な特徴の 1 つは、2 の補数です。 数値の 2 の補数は、その数値の補数に 1 を加えたものに等しくなります。
例:
= 00000000
したがって、その 2 の補数 = -(11111111+1) = -00000000 = -0(10 進数)
注: 任意の数値 N のビットごとの補数は、-(N+1) に等しくなります。
世界トップクラスの大学が提供するソフトウェア開発コースをオンラインで学びましょう。 エグゼクティブ PG プログラム、上級認定プログラム、または修士プログラムを取得して、キャリアを加速させましょう。
4. ビット単位の排他的論理和 (XOR):
排他的論理和演算は、2 つの入力を受け入れ、いずれか一方の入力が 1 の場合に 1 を出力します。ただし、両方が 1 の場合、結果は 0 です。両方の入力が 0 または両方が 1 の場合、結果は 0 です。結果の XOR は、2 つのビットが異なる場合にのみ 1 になります。 C および C++ でのこの二項演算子の記号はキャレット (^) です。 さらに、 C & C++のこのビット単位の演算子は、XOR と省略されます。 ビットのすべてのペアに対して排他的論理和演算を実行します。 この演算子に対応するブール演算子がないことに注意する必要があります。
例:
次の 2 つの数値があるとします。
= 10101010
b = 01110010
今a ^ b = 10101010 ^ 01110010 = 11011000
XOR は次のように理解できます。 A と呼ぶ 0 または 1 のビットがあるとします。ここで、A XOR 0 を取得すると、A が返されます。 したがって、A が 1 の場合は 1 になり、その逆も同様です。 A XOR 1 を取るときは、A を反転することを意味します。つまり、A が 1 の場合は 0 を取得し、その逆も同様です。
ビット単位の XOR 演算を 2 回実装する場合、つまり A と B の 2 つのビットがあり、C = A XOR B を設定すると、C XOR B を実行します。この場合、得られる結果は A XOR B XOR C になります。 A の各ビットを 2 回反転するか、どのビットも反転しません。 したがって、単に A をそのまま返すだけです。
バイナリ XOR 演算は、一種の選択的なひねりと考えることができます。 1 つがすべて 1 である 2 つの数値に XOR を実装すると、結果は twiddle と同じになります。
5. 左シフト演算子:
このビット単位の演算子は、指定されたビット数だけすべてのビットを左にシフトします。 左シフト演算子が空にしたビット位置は 0 で埋められます。その記号は << です。
C または C++ では、最初に 2 つの数値を取り、最初のオペランドのビットを左にシフトし、2 番目のオペランドが数値をシフトする桁数を示すように機能します。
構文:
<<= 5
左シフト演算子を実装する C/C++ プログラムの例を次に示します。
int main()
{
int a = 5;
<<= 2;
カウント << “x : ” << x << endl;
}
出力: a = 20
ソフトウェア エンジニアリングに関する人気のコースと記事
人気番組 | |||
ソフトウェア開発のエグゼクティブ PG プログラム - IIIT B | ブロックチェーン証明書プログラム - PURDUE | サイバーセキュリティ証明書プログラム - PURDUE | コンピューター サイエンスの MSC - IIIT B |
その他の人気記事 | |||
米国のクラウド エンジニアの給与 2021-22 | 米国でのAWSソリューションアーキテクトの給与 | 米国のバックエンド開発者の給与 | 米国のフロントエンド開発者の給与 |
アメリカのウェブ開発者の給与 | 2022年のスクラムマスターインタビューの質問. | 2022年にサイバーセキュリティのキャリアを始めるには? | 工学部学生のための米国でのキャリアオプション |
6. 右シフト演算子:
このビット単位の演算子は、指定されたビット数だけすべてのビットを右にシフトします。 その記号は>>です。 C または C++ では、この演算子は最初に 2 つの数値を取り、最初のオペランドのビットを右にシフトし、2 番目のオペランドは数値のシフト量を指定します。
構文:
>>= 5
右シフト演算子を実装する C/C++ プログラムの例:
int main() {
int a = 5;
>> = 2;
カウント << “x : ” << x << endl;
}
出力: a = 1
ソフトウェア エンジニアリングに関する人気のコースと記事
人気番組 | |||
ソフトウェア開発のエグゼクティブ PG プログラム - IIIT B | ブロックチェーン証明書プログラム - PURDUE | サイバーセキュリティ証明書プログラム - PURDUE | コンピューター サイエンスの MSC - IIIT B |
その他の人気記事 | |||
米国のクラウド エンジニアの給与 2021-22 | 米国でのAWSソリューションアーキテクトの給与 | 米国のバックエンド開発者の給与 | 米国のフロントエンド開発者の給与 |
アメリカのウェブ開発者の給与 | 2022年のスクラムマスターインタビューの質問. | 2022年にサイバーセキュリティのキャリアを始めるには? | 工学部学生のための米国でのキャリアオプション |
C および C++ でビット演算子を使用する必要があるのはいつですか?
- 省スペース:
ビット演算子は、スペースの節約に役立ちます。 個々のビット レベルで作業するときに発生する一般的な問題の 1 つは、より多くのスペースが必要な場合や時間を節約するために、プログラムの大部分を再設計する必要がある場合があることです。 ただし、C および C++ でビットごとの演算子を使用すると、依存関係を排除できます。 たとえば、~0 を使用して可能な最大の整数を取得できます。 2 で乗算するためのビット シフトは、一般的な操作です。 したがって、ビット操作の高度な使用が場合によっては影響を与える可能性があるのとは異なり、読みやすさには影響しません。
- 暗号化:
ある種の暗号化またはブール属性を格納するためにビット フィールドを使用する必要があるシステムで作業している場合。
ビット演算子に関する固有の事実
- キャリーが含まれていない場合、2 つの数値のビットごとの OR は、単純にそれらの数値の合計です。 それ以外の場合は、ビットごとの AND を追加するだけです。 たとえば、x = 5(101) および y = 2(010) とします。 キャリーが含まれていないため、合計は単純に x|y になります。 しかし、ここで「x」を 6 (110) に変更すると、キャリーが含まれるため、合計は x|y + x&y に変更されます。
- ビット単位の XOR 演算子は、技術面接の観点から最も価値があります。 これに関連するインタビューの問題の 1 つの例をここで説明します。 「1 つの数を除いて偶数回出現するすべての要素からなる数の集合について、奇数が出現する数を見つけます。」 この問題を解決するには、すべての数値に対して XOR を実行する必要があります。
- 右および左シフトのビット演算子は、負の数には使用できません。 シフト数を決定する 2 番目のオペランドに負の数が含まれているため、C および C++ で未定義の動作が発生します。 たとえば、1 >>- 1 と 1 << -1 の両方の結果は未定義です。
- 数値のシフトが整数の容量を超えた場合の動作は規定されていません。 たとえば、整数が 64 ビット形式で格納されている場合、1 << 65 は指定されません。
- 第 2 オペランド (シフト数を決定するオペランド) が 0 の場合、シフト操作は発生しません。
UpGrad でコンピュータ サイエンスの旅を始めましょう:
フロントエンド開発 (JavaScript、HTML、CSS)、バックエンド (NoSQL-MongoDB)、およびマイクロサービスについて詳しく学びたい場合は、UpGrad のMaster of Science in Computer Scienceコースを受講できます。 IIIT バンガロール & LJMU 卒業生ステータスによって提供されるこのコースは、世界中の技術系巨人と共にソフトウェア エンジニア/フルスタック開発者としてのキャリアを確立するのに役立ちます。
このコースでは、初心者および技術者以外のコーダー向けの Career Transition Bootcamp への無料アクセスをカバーしています。 このコースでは、10 を超えるプログラミング言語とツールを学習し、業界で複雑な役割を担う準備を万全に整えます。
C++ でのビット演算子の使用は何ですか?
C++ では、ビット演算子はバイナリ レベルで整数データの操作を実行します。 それらは、個々のビットの操作を含むビット パターンで動作します。 そのため、ビット単位の操作はビットレベル プログラミングとも呼ばれます。 C++ のビット演算子は、2 桁、つまり 0 と 1 でのみ機能するため、主に計算を高速化するために使用されます。これらの演算子は、実際のビットをテストしてシフトすることもできます。
コード内で左シフト演算子と右シフト演算子を一緒に使用できますか?
はい、左シフト演算子と右シフト演算子を組み合わせることができます。その後、整数式からデータを抽出できます。
補完演算子はコードのシーケンス全体を反転しますか?
いいえ、そうではありません。 1 と 0 を反転させます。 したがって、すべての 1 は 0 になり、その逆も同様です。
ビット単位の補数演算子の別の名前が 1 の補数演算子であるのはなぜですか?
その理由は、常に 1 つのオペランドまたは値しかとらないためです。 単項演算子です。 任意のビットで補数を実行すると、すべての 0 が 1 になり、その逆も同様です。 たとえば、値が 1111 0000 の整数式があるとします。ビット単位の補数演算を実行すると、値は 0000 1111 になります。