C言語初心者必見!チルダ演算子の使い方とコツ、厳選7つの実用サンプルコード

C言語のチルダ演算子を理解し、実際のプログラムに応用するイラストC言語
この記事は約7分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

皆さんはプログラミング言語の一つであるC言語をご存知でしょうか。

この記事では、C言語の中でも特にチルダ演算子という、初心者にとってはなかなか理解が難しいかもしれない概念について、深く掘り下げて説明していきます。

その使い方やコツ、さらには厳選した7つの実用的なサンプルコードまで、一緒に見ていきましょう。

●C言語とは

C言語は、汎用性が高く、操作性が高いことから世界中で広く使われているプログラミング言語です。

システム開発からゲーム開発まで、幅広い用途に使われています。

その中でも、ビット演算子という特徴的な機能があり、チルダ演算子もその一部です。

●チルダ演算子とは

チルダ演算子(~)は、C言語におけるビット反転演算子の一つで、オペランドの各ビットを反転します。つまり、ビット値が1であれば0に、0であれば1にします。

このチルダ演算子をうまく使いこなすことで、効率的なプログラミングが可能となります。

●チルダ演算子の使い方

それでは具体的に、チルダ演算子をどのように使用するのかを見ていきましょう。

そのために2つのサンプルコードをご紹介します。

○サンプルコード1:基本的なビット反転

まずは基本的なビット反転を行うコードをご覧ください。

#include <stdio.h>

int main() {
    unsigned int a = 5;  // 0000 0101
    printf("%u\n", ~a);  // ビット反転後の値を表示
    return 0;
}

このコードでは、aという変数に値5を代入し、その値のビット反転を行っています。

この例では、aの値は2進数で0000 0101と表されます。

これをチルダ演算子を用いて反転すると1111 1010となり、これが10進数に変換すると250になります。

なので、このコードを実行すると結果は250が表示されます。

○サンプルコード2:数値の範囲を制限する

次に、チルダ演算子を使って数値の範囲を制限する方法を見てみましょう。

#include <stdio.h>

int main() {
    unsigned int a = 300;  // 初期値
    unsigned int b = 0xFF;  // マスク
    printf("%u\n", a & ~b);  // 範囲外のビットをクリア
    return 0;
}

このコードでは、aという変数に値300を代入し、その値のビットのうち特定の範囲外のビットをクリアしています。

具体的には、bというマスクを用いて、8ビット以上のビットをクリアしています。したがって、このコードを実行すると結果は44が表示されます。

●チルダ演算子の詳細な対処法

さて、ここで一つ注意が必要です。それはチルダ演算子はビット反転を行うという特性から、符号付き整数に対して使用すると予期しない結果が得られることがある、という点です。

○サンプルコード3:不要なビットをクリア

例えば、ある範囲のビットだけを反転したい、その他のビットはそのまま保持したいという場合には、チルダ演算子とビットマスクを組み合わせて使用します。

#include <stdio.h>

int main() {
    unsigned int a = 0xF0;  // 初期値
    unsigned int mask = 0x0F;  // ビットマスク
    printf("%u\n", a & ~mask);  // マスク範囲外のビットをクリア
    return 0;
}

このコードでは、maskというビットマスクを用いて特定の範囲のビットを反転し、それ以外のビットを保持しています。

具体的には、maskの下位4ビットを反転しているので、下位4ビットが0aはそのまま0となります。

したがって、このコードを実行すると結果は240が表示されます。

●チルダ演算子の注意点

チルダ演算子を使う際の注意点としては、次の3つがあります。

  1. チルダ演算子はビット単位の反転を行います。
    そのため、全ビットが反転します。
    特定のビットだけを反転させたい場合は、ビットマスクと組み合わせて使いましょう。
  2. チルダ演算子は二の補数形式を使用します。
    そのため、符号付き整数に対して使用すると、予期せぬ結果が得られることがあります。
  1. チルダ演算子は、入力と出力のビット数が一致します。
    つまり、32ビットの整数に対して使用した場合、結果も32ビットの整数となります。

これらの注意点を理解した上で、チルダ演算子を効果的に使いこなしましょう。

●チルダ演算子のカスタマイズ

チルダ演算子は、ビット演算の基本的なツールとして、さまざまな形でカスタマイズして使うことができます。

ここでは、そのいくつか例を見てみましょう。

○サンプルコード4:複雑なビットマスクの作成

#include <stdio.h>

int main() {
    unsigned int a = 0xAB;  // 初期値
    unsigned int mask = 0x0F;  // ビットマスク
    printf("%u\n", a & ~mask);  // マスク範囲外のビットをクリア
    return 0;
}

このコードでは、マスクを用いて特定のビット範囲をクリアし、その他のビットを保持しています。

その結果、このコードを実行すると160が表示されます。

○サンプルコード5:データのエンコードとデコード

#include <stdio.h>

int main() {
    unsigned int a = 0xAB;  // エンコードするデータ
    unsigned int key = 0x0F;  // キー
    unsigned int encoded = a ^ ~key;  // データをエンコード
    printf("%u\n", encoded);  // エンコード結果を表示
    unsigned int decoded = encoded ^ ~key;  // データをデコード
    printf("%u\n", decoded);  // デコード結果を表示
    return 0;
}

このコードでは、チルダ演算子と排他的論理和を用いてデータのエンコードとデコードを行っています。

その結果、エンコード後のデータと元のデータが表示されます。

○サンプルコード6:ビットフィールドの操作

#include <stdio.h>

int main() {
    unsigned int a = 0x0F;  // 初期値
    unsigned int mask = 0x03;  // ビットマスク
    printf("%u\n", a & ~mask);  // マスク範囲外のビットをクリア
    return 0;
}

このコードでは、ビットマスクを用いて特定のビット範囲をクリアし、その他のビットを保持しています。

その結果、このコードを実行すると12が表示されます。

○サンプルコード7:ビット単位の論理演算

#include <stdio.h>

int main() {
    unsigned int a = 0x0F;  // 初期値
    unsigned int b = 0xF0;  // 初期値
    printf("%u\n", a & ~b);  // aとbのビット単位の論理積
    return 0;
}

このコードでは、チルダ演算子と論理積演算子を組み合わせて、2つの数値のビット単位の論理演算を行っています。

その結果、このコードを実行すると0が表示されます。

これらのサンプルコードを通じて、チルダ演算子の多様な利用方法とその応用例を理解できましたでしょうか。

まとめ

今回はC言語のチルダ演算子について詳しく解説しました。

その基本的な使い方から応用例、カスタマイズ方法までを学び、7つのサンプルコードを通じて理解を深めることができたと思います。

この知識を活かして、より効率的なC言語プログラミングを行いましょう。