工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C 言語ビット演算子マスター: AND、OR、XOR、シフト、補数

ビット演算子とは?

ビット演算子は整数値の個々のビットを操作します。算術演算子が数値全体で働くのに対し、ビット演算子は二進表現に作用するため、フラグ、ビットマスク、ローレベルデバイス制御などのパフォーマンスクリティカルなタスクに最適です。

C 言語では以下のビット演算子が利用可能です:

演算子意味
&ビット単位 AND
|ビット単位 OR
^ビット単位 XOR (排他的論理和)
~ビット単位 NOT (1 の補数)
<<左シフト
>>右シフト

ビット演算子は整数型のみで定義され、float や double などの浮動小数点型には適用できません。

演算は最下位ビット (LSB) から最上位ビット (MSB) に向かって行われます。以下の真理値表は二進演算の結果をまとめたものです:

オペランド xオペランド yx & yx | yx ^ y
00000
01011
10011
11110

以下のセクションで各演算子を例とともに詳しく解説します。

ビット単位 AND (&)

AND 演算子は、対応する両ビットが 1 の場合のみ 1 を返し、それ以外は 0 を返します。不要なビットをマスクするのによく使用されます。

Op1 = 0000 1101
Op2 = 0001 1001
Result = 0000 1001

ビット単位 OR (|)

OR 演算子は、少なくとも一方のビットが 1 なら 1 を返します。特定のビットをセットするのに便利です。

Op1 = 0000 1101
Op2 = 0001 1001
Result = 0001 1101

ビット単位 XOR (^)

XOR 演算子は、ビットが異なる場合のみ 1 を返します。ビットの切り替え (トグル) に役立ちます。

Op1 = 0000 1101
Op2 = 0001 1001
Result = 0001 0100

例プログラム:

#include <stdio.h>
int main() {
    int a = 20; /* 20 = 010100 */
    int b = 21; /* 21 = 010101 */
    int c = 0;
    c = a & b; /* 20 = 010100 */
    printf("AND - c = %d\n", c);
    c = a | b; /* 21 = 010101 */
    printf("OR - c = %d\n", c);
    c = a ^ b; /* 1 = 000001 */
    printf("XOR - c = %d\n", c);
    return 0;
}

出力:

AND - c = 20
OR - c = 21
XOR - c = 1

ビットシフト演算子 (<< および >>)

シフト演算子はビットを指定回数左右に移動させます。

4 ビット数 1111 での例:

x << 2 → 1100
x >> 2 → 0011

プログラム例:

#include <stdio.h>
int main() {
    int a = 20; /* 20 = 010100 */
    int c = 0;
    c = a << 2; /* 80 = 101000 */
    printf("Left shift - c = %d\n", c);
    c = a >> 2; /* 5 = 000101 */
    printf("Right shift - c = %d\n", c);
    return 0;
}

出力:

Left shift - c = 80
Right shift - c = 5

ビット単位補数 (~)

補数演算子はすべてのビットを反転: 1 を 0 に、0 を 1 にします。単一オペランドに適用される単項演算子です。

0000 1111 → 1111 0000

例プログラム:

#include <stdio.h>
int main() {
    int a = 10; /* 10 = 001010 */
    int c = ~a; /* 2 の補数で -11 */
    printf("Complement - c = %d\n", c);
    return 0;
}

出力:

Complement - c = -11

すべての演算子を組み合わせた例

以下は、議論したすべてのビット演算子を示す簡潔なプログラムです。

#include <stdio.h>
int main() {
    unsigned int x = 48; /* 0011 0000 */
    unsigned int y = 13; /* 0000 1101 */
    int z = 0;
    z = x & y; /* 0 = 0000 0000 */
    printf("AND - x & y = %d\n", z);
    z = x | y; /* 61 = 0011 1101 */
    printf("OR - x | y = %d\n", z);
    z = x ^ y; /* 61 = 0011 1101 */
    printf("XOR - x ^ y = %d\n", z);
    z = ~x; /* -49 = 1111 0100 (2 の補数) */
    printf("NOT - ~x = %d\n", z);
    z = x << 2; /* 192 = 1100 0000 */
    printf("Left shift - x << 2 = %d\n", z);
    z = x >> 2; /* 12 = 0000 1100 */
    printf("Right shift - x >> 2 = %d\n", z);
    return 0;
}

結果:

AND - x & y = 0
OR - x | y = 61
XOR - x ^ y = 61
NOT - ~x = -49
Left shift - x << 2 = 192
Right shift - x >> 2 = 12

重要なポイント

C言語

  1. IoTとブロックチェーン:データ信頼と効率のパラダイムシフト
  2. C# クラスとオブジェクト:堅牢な OOP の基礎
  3. C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
  4. C# 部分クラスと部分メソッドを理解する
  5. C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
  6. C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
  7. C言語キーワードと識別子:実践ガイド
  8. C言語演算子完全ガイド:算術・関係・論理・ビット演算子
  9. C++演算子を徹底解説:種類、例、サンプルプログラム付き
  10. C言語の定数とリテラル:型、使い方、ベストプラクティス
  11. Python演算子完全ガイド:算術、論理、比較、代入、ビットワイズ、優先順位