「ユーザーIDごとに付与された権限フラグの数値から、編集権限を持っている人だけを抽出したい…」
スプレッドシートでアカウント管理台帳やシステム権限の一覧を扱っていると、ビットフラグで管理された権限値を1件ずつ手で判定するのは大変ですよね。フラグの数が増えると、IF文を何重にも重ねた数式は保守も難しくなります。
そんなときに便利なのがGoogleスプレッドシートのBITAND関数です。2つの数値をビット単位でAND演算して、特定のビットが立っているかを一発で判定できますよ。
しかも結果は数値型で返るので、IF関数やARRAYFORMULAと組み合わせて一覧を一括判定できます。Excelとも互換性があるため、ファイルをやり取りする現場でも安心して使えますね。
この記事では、スプレッドシートのBITAND関数の基本から権限チェック・複数フラグ判定・Linuxパーミッション解析まで解説します。BITOR・BITXORとの使い分けやエラー対処法にも触れていきますよ。
BITAND関数とは?
BITAND関数(ビットアンド関数)は、2つの数値をビット単位でAND演算(論理積)し、結果を10進数の数値で返す関数です。
「ビット単位のAND演算」とは、2つの数値を2進数に変換して、同じ位置のビットがどちらも1のときだけ1を返す計算のことです。
たとえば、5と12のビットANDを求める場合を見てみましょう。
- 5 を2進数にすると →
0101 - 12 を2進数にすると →
1100 - AND演算の結果 →
0100(= 10進数の4)
両方のビットが1になっている桁だけが残るイメージですね。
GoogleスプレッドシートのBITAND関数は、Excelと同じ構文で使えます。アクセス権限のチェックやフラグ管理など、業務の自動化で活躍してくれますよ。
BITAND関数の書き方(構文と引数)
基本構文
=BITAND(値1, 値2)
引数は2つとも必須です。省略するとエラーになります。
引数の詳細
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 値1 | 必須 | AND演算を行う1つ目の数値(0以上の整数) |
| 値2 | 必須 | AND演算を行う2つ目の数値(0以上の整数) |
どちらの引数にも、0以上かつ(2^48)-1(= 281,474,976,710,655)以下の整数を指定します。この範囲を超えると#NUM!エラーになるので注意してくださいね。
TIP
Excel側で動かしていた数式と互換性があるため、ExcelファイルをGoogleスプレッドシートで開いた場合でもそのまま動作します。逆にスプレッドシートで作った数式をExcelで開いても問題ありませんよ。
ビットAND演算のイメージ表
BITAND関数の動きをイメージしやすくするため、よく使われる組み合わせを表にまとめました。
| 値1 | 値2 | 値1(2進) | 値2(2進) | AND結果(2進) | 結果(10進) |
|---|---|---|---|---|---|
| 5 | 12 | 0101 | 1100 | 0100 | 4 |
| 13 | 11 | 1101 | 1011 | 1001 | 9 |
| 7 | 2 | 0111 | 0010 | 0010 | 2 |
| 7 | 5 | 0111 | 0101 | 0101 | 5 |
| 15 | 10 | 1111 | 1010 | 1010 | 10 |
| 8 | 1 | 1000 | 0001 | 0000 | 0 |
「両方とも1の桁だけが残る」というルールが見えてきますね。値2をマスクとして使うと、値1の中から特定のビットだけを抜き出せるという考え方が、フラグ管理の基本になりますよ。
BITAND関数の基本的な使い方
数値を直接指定する
もっともシンプルな使い方から見ていきましょう。
=BITAND(5, 12)
結果は「4」です。先ほどの表のとおり、0101と1100のAND演算で0100(= 4)が返ります。
=BITAND(13, 11)
結果は「9」です。1101と1011のAND演算で1001(= 9)になります。
セル参照で指定する
実務では、セルに入っている権限値を判定する場面が多いです。A2に「7」、B2に「2」が入っている場合は次のように書きます。
=BITAND(A2, B2)
結果は「2」です。0111と0010のAND演算で0010(= 2)が返ります。
途中の2進数表現を確認したいときは、DEC2BIN関数を組み合わせると分かりやすいですよ。
=DEC2BIN(A2) → "111"
=DEC2BIN(B2) → "10"
ARRAYFORMULAで一括判定する
スプレッドシートならではの強みが、ARRAYFORMULA関数との組み合わせです。
=ARRAYFORMULA(BITAND(A2:A10, 2))
A2からA10までの権限値に対して、「編集権限(= 2)」のビットが立っているかを1つの数式で一気に判定できます。
| A列: 権限値 | B列: 数式 | 結果 |
|---|---|---|
| 7 | =ARRAYFORMULA(BITAND(A2:A6, 2)) | 2 |
| 5 | ↓ | 0 |
| 6 | ↓ | 2 |
| 3 | ↓ | 2 |
| 4 | ↓ | 0 |
結果が0より大きければ編集権限ありと判定できますよ。
実務活用例1:アクセス権限のチェック
BITAND関数の代表的な活用が、ビットフラグで管理されたアクセス権限のチェックです。
権限ビットの設計例
たとえば、社内システムの権限を以下のようにビットフラグで管理しているとします。
| ビット位置 | 権限 | 値(10進) | 値(2進) |
|---|---|---|---|
| 1桁目 | 閲覧 | 1 | 0001 |
| 2桁目 | 編集 | 2 | 0010 |
| 3桁目 | 削除 | 4 | 0100 |
| 4桁目 | 管理 | 8 | 1000 |
ユーザーの権限値が「7」の場合、2進数では0111です。閲覧・編集・削除の3つの権限を持っていることになりますね。
単一権限のチェック
「編集権限(= 2)を持っているか」を判定するには、次の数式を使います。
=BITAND(A2, 2)
A2に「7」が入っていれば、結果は「2」です。0より大きいので、編集権限があると判定できます。A2に「5」(= 0101、閲覧と削除のみ)が入っていれば、結果は「0」となり編集権限なしと判定できますよ。
IF関数と組み合わせると、もっと分かりやすくなります。
=IF(BITAND(A2, 2) > 0, "編集可", "編集不可")
A2セルにユーザーの権限値を入れておけば、編集権限の有無を自動判定できますよ。
ARRAYFORMULAで一覧を一括判定
ユーザー一覧から編集可能なメンバーだけを抽出したい場合は、次のように書きます。
=ARRAYFORMULA(IF(BITAND(B2:B100, 2) > 0, "編集可", "編集不可"))
B列に100人分の権限値が並んでいても、1つの数式で全員の編集権限を判定できますよ。
実務活用例2:複数フラグの一括チェック
「セール対象かつ送料無料」のように、複数のフラグが同時に立っているかを判定する場面でもBITAND関数が活躍します。
商品属性のフラグ設計例
| ビット | 属性 | 値(10進) |
|---|---|---|
| 1桁目 | セール対象 | 1 |
| 2桁目 | 送料無料 | 2 |
| 3桁目 | 新商品 | 4 |
| 4桁目 | 限定品 | 8 |
商品コード「5」(= 0101)はセール対象かつ新商品、商品コード「11」(= 1011)はセール対象・送料無料・限定品です。
「すべて満たす」の判定
「セール対象かつ送料無料」(= 値1+値2 = 3、0011)の商品を抽出するには、次のように書きます。
=IF(BITAND(A2, 3) = 3, "対象", "対象外")
BITAND関数の結果がチェック値(= 3)と完全一致したら、両方のフラグが立っていると判定できます。
| A列: 商品コード | 2進表現 | BITAND(A2,3) | 判定 |
|---|---|---|---|
| 3 | 0011 | 3 | 対象 |
| 5 | 0101 | 1 | 対象外(送料無料なし) |
| 7 | 0111 | 3 | 対象 |
| 11 | 1011 | 3 | 対象 |
| 12 | 1100 | 0 | 対象外 |
「= 3」と等価判定する点がポイントです。「> 0」だとどちらか片方でもヒットしてしまうので、用途に応じて使い分けてくださいね。
「いずれかを満たす」の判定
逆に「セールか送料無料、どちらか一方でも当てはまる」を判定したい場合は、結果を0と比較します。
=IF(BITAND(A2, 3) > 0, "対象", "対象外")
こちらは0より大きければOKなので、片方のフラグだけ立っていてもヒットしますよ。
実務活用例3:Linuxパーミッションのrwx分解
サーバー管理の現場では、755や644といった3桁のパーミッション値を読・書・実行の権限に分解したい場面があります。BITAND関数を使うと、各権限の有無を1桁ずつ判定できますよ。
rwxフラグの設計
Linuxパーミッションの1桁は、3つのビットフラグの合計です。
| ビット | 権限 | 値(10進) |
|---|---|---|
| 1桁目 | 実行(x) | 1 |
| 2桁目 | 書き込み(w) | 2 |
| 3桁目 | 読み込み(r) | 4 |
たとえば「7」は4+2+1で読・書・実行すべて、「5」は4+1で読・実行のみを意味します。
オーナー権限を分解する
A2に「755」が入っている場合、左端の「7」(オーナー権限)を取り出してBITANDで分解します。
=BITAND(VALUE(MID(A2,1,1)), 4) ← 読み込み権限の有無
=BITAND(VALUE(MID(A2,1,1)), 2) ← 書き込み権限の有無
=BITAND(VALUE(MID(A2,1,1)), 1) ← 実行権限の有無
| 数式 | 結果 | 意味 |
|---|---|---|
| =BITAND(VALUE(MID(“755”,1,1)), 4) | 4 | オーナー読み込みあり |
| =BITAND(VALUE(MID(“755”,1,1)), 2) | 2 | オーナー書き込みあり |
| =BITAND(VALUE(MID(“755”,1,1)), 1) | 1 | オーナー実行あり |
MID関数で取り出した値は文字列なので、VALUE関数で数値に変換してからBITANDに渡している点がポイントです。
rwx文字列で見やすく整形する
if文でrwx文字列を作ると、サーバー設定資料がぐっと見やすくなります。
=IF(BITAND(VALUE(MID(A2,1,1)),4)>0,"r","-") &
IF(BITAND(VALUE(MID(A2,1,1)),2)>0,"w","-") &
IF(BITAND(VALUE(MID(A2,1,1)),1)>0,"x","-")
A2が「755」なら「rwx」、「644」なら「rw-」が返ります。Linuxのls -lコマンドの出力イメージで権限を可視化できますね。
BITAND関数とExcelの互換性
GoogleスプレッドシートのBITAND関数は、ExcelのBITAND関数と仕様が同じです。構文・引数・有効範囲・エラー条件のすべてが一致しています。
ExcelファイルをGoogleスプレッドシートで開いた場合でも、BITAND関数はそのまま動作します。逆にスプレッドシートで作成した数式をExcelで開いても問題ありませんよ。
Excel側の使い方を確認したい場合は、ExcelのBITAND関数の記事も参考にしてくださいね。
エラーの種類と対処法
#NUM! エラー
次のいずれかに当てはまると #NUM! エラーになります。
- 引数に負の数を指定した
- 引数が
(2^48)-1(= 281,474,976,710,655)を超えている - 引数に小数を指定した
=BITAND(-1, 2) → #NUM!(負の数は不可)
=BITAND(2.5, 2) → #NUM!(小数は不可)
対処法は、INT関数で整数化してから渡すことです。
=BITAND(INT(A1), INT(B1))
#VALUE! エラー
引数に文字列を指定すると #VALUE! エラーになります。MID関数などで取り出した文字列をそのまま渡すと発生しがちです。
対処法はVALUE関数で数値化することです。
=BITAND(VALUE(A1), VALUE(B1))
エラー対処:IFERRORで包む
権限値の入力が信頼できない場合は、IFERRORで包んでおくと安心です。
=IFERROR(BITAND(A2, 2), "判定不可")
他のビット演算関数との使い分け
スプレッドシートにはBITAND以外にもビット演算関数が用意されています。場面に応じて使い分けましょう。
| 関数 | 演算 | 説明 | 使いどころ |
|---|---|---|---|
| BITAND | AND(論理積) | 両方1のビットだけ残す | 権限チェック・フラグ抽出 |
| BITOR | OR(論理和) | どちらか1のビットを残す | 権限の付与・フラグ追加 |
| BITXOR | XOR(排他的論理和) | 異なるビットだけ残す | フラグの切り替え(トグル) |
| BITLSHIFT | 左シフト | ビットを左にずらす | 値の2倍・4倍計算 |
| BITRSHIFT | 右シフト | ビットを右にずらす | 値の半分計算 |
BITANDは「特定のビットが立っているか確認する」ときに使います。フラグを追加したいときはBITOR、フラグのON/OFFを切り替えたいときはBITXORが便利ですよ。
まとめ
GoogleスプレッドシートのBITAND関数は、2つの数値をビット単位でAND演算する関数です。フラグ管理や権限チェックの自動化で大きな威力を発揮しますよ。
- 構文は
=BITAND(値1, 値2)、引数は0以上の整数 - マスク値とのANDで「特定のビットが立っているか」を判定できる
- IF・ARRAYFORMULAと組み合わせて一覧を一括判定できる
- 「すべて満たす」は
= マスク値、「いずれか満たす」は> 0で判定 - Linuxパーミッションのrwx分解にも活用できる
- ExcelのBITAND関数と完全互換
ビット演算は一見難しそうに見えますが、BITAND関数を使えば権限チェックやフラグ判定がシンプルな数式で書けるようになります。まずは「BITAND(権限値, チェックしたいビット) > 0」のパターンから試してみてくださいね。
