アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【C/C++
【C/C++】処理系に依存しない64ビットフラグ演算集【保存版】
POSTED BY
2023-01-18

【C言語】ビットフラグ演算でデータの特徴を管理する

の改良版で、フラグ管理変数の長さを64ビットにする場合のサンプルです。
sizeof(int)やsizeof(long)は処理系に依存し、32ビットのこともあれば64ビットのこともあります。

stdint.hで定義されているuint32_t, uint64_tを使えば処理系に依存せず意図したビット長で変数を管理できます。

C/C++uint64_bitflag.cGitHub Source
/* stdint.h/uint64_tを使ったビットフラグ */
#include <stdio.h>
#include <stdint.h>

#define F_BIT01_1 0x0000000000000001
#define F_BIT01_2 0x0000000000000002
#define F_BIT01_4 0x0000000000000004
#define F_BIT01_8 0x0000000000000008

#define F_BIT16_1 0x1000000000000000
#define F_BIT16_2 0x2000000000000000
#define F_BIT16_4 0x4000000000000000
#define F_BIT16_8 0x8000000000000000

int main(void) {
  uint64_t bit;

  bit = F_BIT01_1 | F_BIT16_8;

  printf("bit = %016lX\n", bit);

  if(bit & F_BIT01_1) {
    printf("F_BIT01_1 IS ON\n");
  }

  if(bit & F_BIT16_8) {
    printf("F_BIT16_8 IS ON\n");
  }

  if(!(bit & F_BIT01_8)) {
    printf("F_BIT01_8 IS OFF\n");
  }

  /* 特定のビットをONにする */

  bit |= F_BIT01_8;

  printf("bit = %016lX\n", bit);

  if(bit & F_BIT01_8) {
    printf("F_BIT01_8 IS ON\n");
  }

  /* 特定のビットをOFFにする */

  bit &= ~(F_BIT01_8);

  printf("bit = %016lX\n", bit);

  if(!(bit & F_BIT01_8)) {
    printf("F_BIT01_8 IS OFF\n");
  }

  return 0;
}

コンパイル、実行結果

gcc uint64_bitflag.c
./a.out

bit = 8000000000000001
F_BIT01_1 IS ON
F_BIT16_8 IS ON
F_BIT01_8 IS OFF
bit = 8000000000000009
F_BIT01_8 IS ON
bit = 8000000000000001
F_BIT01_8 IS OFF

64ビットだと1ケタにつき4通りのフラグを登録できるので、16ケタあるので16×4=64通りの特徴を管理できる。

各特徴(ビットフラグ)は|(OR演算子)で組み合わせて複数持たせられる。

指定の特徴を保有しているかは&(AND演算子)にかけて抜き出し判別できる。

逆に指定の特徴を保有していないかをチェックするには上記判定を!演算子で囲って判別する。

「%016lX」はフォーマット指定子で、「ゼロ埋めの16ケタLONG変数を16進数で表示せよ」の意である。

後から変数に特定のビットを追加するには|=演算子で代入すればよい。

逆に特定のビットを取り去るには~(否定演算子)で囲ったものを&=演算子で代入するという、見た目トリッキーな方法を取る。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】