0Pricing
C Academy · レッスン

ビット演算子

AND、OR、XOR、NOT です。

「ビット演算子」はCoddyKit上の無料C Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

ビットレベルで処理する

整数はビットの並びとして格納されます。C ではビット演算子を使って、ビットを直接操作できます。

基本となる 4 つの演算子は、AND &、OR |、XOR ^、NOT ~ です。

#include <stdio.h>

int main(void) {
    unsigned a = 12;
    unsigned b = 10;
    printf("a & b = %u\n", a & b);
    return 0;
}

ビット単位の AND

& 演算子は、入力ビット両方が 1 の場合にだけ、結果のビットを 1 にします。

12(1100)と 10(1010)の結果は 8(1000)です。

#include <stdio.h>

int main(void) {
    unsigned a = 12, b = 10;
    printf("%u & %u = %u\n", a, b, a & b);
    return 0;
}

ビット単位の OR

| 演算子は、入力ビットの少なくとも一方が 1 の場合に、結果のビットを 1 にします。

12(1100)と 10(1010)の OR は 14(1110)です。

#include <stdio.h>

int main(void) {
    unsigned a = 12, b = 10;
    printf("%u | %u = %u\n", a, b, a | b);
    return 0;
}

ビット単位の XOR

^ 演算子(排他的 OR)は、入力ビットが異なる場合に結果のビットを 1 にします。

12(1100)と 10(1010)の XOR は 6(0110)です。

#include <stdio.h>

int main(void) {
    unsigned a = 12, b = 10;
    printf("%u ^ %u = %u\n", a, b, a ^ b);
    return 0;
}

ビット単位の NOT

~ 演算子はすべてのビットを反転します。符号なしの値では、~0 はすべてのビットが 1 となり、最大値になります。

#include <stdio.h>

int main(void) {
    unsigned char x = 0;
    printf("~0 as 8-bit = %u\n", (unsigned char)~x);
    return 0;
}

ビットを出力する

バイトの 2 進表現を出力するヘルパーを使うと、ビット演算の結果を理解しやすくなります。各ビットを上位から下位へ調べます。

#include <stdio.h>

void print_bits(unsigned char v) {
    for (int i = 7; i >= 0; i--) {
        putchar((v >> i) & 1 ? '1' : '0');
    }
    putchar('\n');
}

int main(void) {
    print_bits(12);
    print_bits(10);
    return 0;
}

XOR で入れ替える

XOR には便利な性質があり、一時変数を使わずに 2 つの整数を入れ替えられます。

XOR を 3 回適用して値を交換します。

#include <stdio.h>

int main(void) {
    int a = 5, b = 9;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d b=%d\n", a, b);
    return 0;
}

自分自身との XOR

任意の値を自分自身と XOR すると 0 になり、任意の値を 0 と XOR すると値は変わりません。

これらの恒等式は、XOR による入れ替えや多くのテクニックの基礎となります。

#include <stdio.h>

int main(void) {
    int x = 42;
    printf("x ^ x = %d\n", x ^ x);
    printf("x ^ 0 = %d\n", x ^ 0);
    return 0;
}

ビット演算と論理演算の違い

& と &&、または | と || を混同しないでください。

  • ビット演算子は、オペランドのすべてのビットに対して動作します。
  • 論理演算子は真偽値として評価し、0 または 1 を返します。
#include <stdio.h>

int main(void) {
    printf("2 & 1 = %d\n", 2 & 1);
    printf("2 && 1 = %d\n", 2 && 1);
    return 0;
}

演算子を組み合わせる

ビット演算子を組み合わせると、複雑な条件を表現できます。ここでは、a に存在し、b には存在しないビットを残します。

#include <stdio.h>

int main(void) {
    unsigned a = 0b1111;
    unsigned b = 0b0101;
    unsigned only_a = a & ~b;
    printf("only_a = %u\n", only_a);
    return 0;
}

XOR で偶奇を確認する

すべてのビットを XOR すると、1 になっているビットの個数が奇数かどうかという偶奇性が分かります。値を繰り返し折りたたむようにしていきます。

#include <stdio.h>

int main(void) {
    unsigned v = 0b1011;
    int parity = 0;
    while (v) {
        parity ^= (v & 1);
        v >>= 1;
    }
    printf("parity = %d\n", parity);
    return 0;
}

確認問題

ビット演算子についての知識を確認しましょう。

まとめ

ビット演算子について、次のことを学びました。

  • & AND は、両方のオペランドで設定されているビットを残します。
  • | OR は、いずれかのオペランドで設定されているビットを残します。
  • ^ XOR は、異なるビットを残します。
  • ~ NOT は、すべてのビットを反転します。
  • ビット演算は、論理演算の && や || とは異なります。

よくある質問

「ビット演算子」レッスンは無料ですか?

はい。「ビット演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「ビット演算子」で何を学びますか?

AND、OR、XOR、NOT です。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ビット演算子」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ビット演算子
  2. シフト
  3. ビットマスクとフラグ
  4. 実践的なビット技巧
← C Academyに戻る