「権限のON/OFFをワンタッチで切り替えたい…」「2つのフラグ値の違いだけを取り出したい…」
スプレッドシートで権限管理シートやフラグ管理表を運用していると、「今ある権限を反転させたい」「先月と今月で何が変わったかだけ知りたい」といった場面が出てきますよね。IF関数の入れ子で書くと数式が長くなり、メンテナンスが大変になりがちです。
そんなときに便利なのがGoogleスプレッドシートのBITXOR関数です。2つの数値をビット単位でXOR演算して、ビットの「切り替え」と「違い」を一発で取り出せますよ。
しかも結果は数値型で返るので、IF関数やARRAYFORMULAと組み合わせて一覧を一括処理できます。Excelとも互換性があるため、ファイルをやり取りする現場でも安心して使えますね。
この記事では、スプレッドシートのBITXOR関数の基本からフラグのトグル・差分検出・パリティ計算まで解説します。BITAND・BITORとの使い分けやエラー対処法にも触れていきますよ。
BITXOR関数とは?
スプレッドシートのBITXOR関数(ビットエックスオア関数)は、2つの数値をビット単位でXOR演算する関数です。結果は10進数の数値で返ります。
「ビット単位のXOR演算」とは、2つの数値を2進数に変換し、同じ位置のビットを比べる計算のことです。両者のビットが異なるとき(一方が1で他方が0)だけ1になります。同じビット(両方0または両方1)の場合は0になりますよ。
たとえば、5と6のビットXORを求める場合を見てみましょう。
- 5 を2進数にすると →
0101 - 6 を2進数にすると →
0110 - XOR演算の結果 →
0011(= 10進数の3)
「違うところだけ1になる」と覚えると分かりやすいですね。
GoogleスプレッドシートのBITXOR関数は、ExcelのBITXOR関数と同じ構文で使えます。フラグのトグル操作や差分抽出など、「変化」を扱う業務で活躍してくれますよ。
BITXOR関数の書き方(構文と引数)
基本構文
=BITXOR(値1, 値2)
引数は2つとも必須です。省略するとエラーになります。
引数の詳細
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 値1 | 必須 | XOR演算を行う1つ目の数値(0以上の整数) |
| 値2 | 必須 | XOR演算を行う2つ目の数値(0以上の整数) |
どちらの引数にも、0以上かつ(2^48)-1(= 281,474,976,710,655)以下の整数を指定します。この範囲を超えると#NUM!エラーになるので注意してくださいね。
TIP
BITXOR関数はExcelとの互換性があるため、ExcelファイルをGoogleスプレッドシートで開いてもそのまま動作します。逆もまた然りです。バージョン違いで挙動が変わる心配はいりませんよ。
ビットXOR演算のイメージ表
BITXOR関数の動きをイメージしやすくするため、よく使われる組み合わせを表にまとめました。
| 値1 | 値2 | 値1(2進) | 値2(2進) | XOR結果(2進) | 結果(10進) |
|---|---|---|---|---|---|
| 5 | 6 | 0101 | 0110 | 0011 | 3 |
| 5 | 10 | 0101 | 1010 | 1111 | 15 |
| 7 | 5 | 0111 | 0101 | 0010 | 2 |
| 12 | 10 | 1100 | 1010 | 0110 | 6 |
| 5 | 5 | 0101 | 0101 | 0000 | 0 |
| 0 | 9 | 0000 | 1001 | 1001 | 9 |
「同じビットなら0、違うビットなら1」というルールが見えてきますね。同じ値同士のXORが必ず0になる点もポイントです。
このルールから、BITXORには次の2つの大きな特徴が生まれます。
- トグル: 同じ値で2回XORすると元に戻る(A XOR B XOR B = A)
- 差分検出: 結果が0なら2つの値は等しく、結果のビットが立っている位置が違いを示す
この特徴を活かすと、フラグの切り替えや差分抽出がシンプルな数式で書けますよ。
BITXOR関数の基本的な使い方
数値を直接指定する
もっともシンプルな使い方から見ていきましょう。
=BITXOR(5, 6)
結果は「3」です。先ほどの表のとおり、0101と0110のXOR演算で0011(= 3)が返ります。
=BITXOR(5, 5)
結果は「0」です。同じ値同士のXORは必ず0になります。これが「2回XORで元に戻る」という性質の出発点ですよ。
セル参照で指定する
実務では、セルに入っているフラグ値同士をXORする場面が多いです。A2に「12」、B2に「10」が入っている場合は次のように書きます。
=BITXOR(A2, B2)
結果は「6」です。1100と1010のXOR演算で0110(= 6)が返ります。
途中の2進数表現を確認したいときは、DEC2BIN関数を組み合わせると分かりやすいですよ。
=DEC2BIN(A2) → "1100"
=DEC2BIN(B2) → "1010"
ARRAYFORMULAで一括XORする
スプレッドシートならではの強みが、ARRAYFORMULA関数との組み合わせです。
=ARRAYFORMULA(BITXOR(A2:A10, B2:B10))
A列とB列に並んだ値を、1つの数式でまとめてXORできます。
| A列: 先月の権限 | B列: 今月の権限 | 結果(BITXOR) |
|---|---|---|
| 1 | 3 | 2 |
| 5 | 5 | 0 |
| 4 | 6 | 2 |
| 0 | 8 | 8 |
| 7 | 1 | 6 |
結果が0の行は「変化なし」、それ以外の行は「変わったビットだけ」が浮かび上がってきますよ。差分チェックがこれだけで完結するのは便利ですね。
実務活用例1:権限フラグのON/OFF切り替え(トグル)
BITXOR関数のもっとも代表的な活用が、ビットフラグで管理された権限のトグル操作です。
権限ビットの設計例
たとえば、社内システムの権限を以下のようにビットフラグで管理しているとします。
| ビット位置 | 権限 | 値(10進) | 値(2進) |
|---|---|---|---|
| 1桁目 | 閲覧 | 1 | 0001 |
| 2桁目 | 編集 | 2 | 0010 |
| 3桁目 | 削除 | 4 | 0100 |
| 4桁目 | 管理 | 8 | 1000 |
ユーザーの現在の権限値が「3」(閲覧+編集)だとして、ここで「編集(= 2)」を切り替えたいケースを考えます。
単一権限のトグル
「編集権限を持っていればOFFに、持っていなければONに切り替える」には、次の数式を使います。
=BITXOR(A2, 2)
A2に「3」(閲覧+編集)が入っていれば、結果は「1」(閲覧のみ)です。0011と0010のXORで0001になり、編集権限だけがOFFになりますね。
A2に「1」(閲覧のみ)が入っていれば、結果は「3」(閲覧+編集)になります。同じ数式で、ON/OFFを自動で切り替えできるのがBITXORの真骨頂ですよ。
NOTE
BITORで「付与」、BITANDで「チェック」、BITXORで「トグル」と覚えておくと、ビット演算3兄弟の役割分担がスッキリします。トグルは「2回かければ元に戻る」性質を活かした処理ですよ。
複数権限を一気にトグル
「閲覧と削除を同時に切り替えたい」場合は、対象ビットの合計値(1+4 = 5)をマスク値として渡します。
=BITXOR(A2, 5)
A2が「3」(閲覧+編集)なら、結果は「6」(編集+削除)になります。閲覧がOFFになり、削除がONになる動きですね。
ARRAYFORMULAで一覧に一括トグル
ユーザー一覧の全員に対して「編集権限(= 2)を一括トグル」したい場合は、次のように書きます。
=ARRAYFORMULA(BITXOR(B2:B100, 2))
B列に100人分の権限値が並んでいても、1つの数式で全員の編集権限を反転できますよ。月次のキャンペーンで「全員に一時的に編集権限を付与し、終わったら元に戻す」といった運用にも応用できますね。
実務活用例2:2つのフラグ値の差分を検出する
BITXORは「2つの値で違うビットだけ取り出す」性質があるため、差分検出にぴったりです。
月次の権限変更を抽出する
先月と今月の権限値を比べて、「どの権限が変わったか」を一覧化したい場面を考えます。
| 社員 | 先月の権限(A列) | 今月の権限(B列) | 差分(BITXOR) | 変化の意味 |
|---|---|---|---|---|
| 田中 | 3 | 7 | 4 | 削除権限が変化(追加) |
| 鈴木 | 5 | 5 | 0 | 変化なし |
| 佐藤 | 7 | 3 | 4 | 削除権限が変化(剥奪) |
| 山田 | 1 | 11 | 10 | 編集と管理が変化 |
C列に次の数式を入れるだけで差分が出ます。
=BITXOR(A2, B2)
結果が0なら「変化なし」、それ以外なら「変わったビットの合計値」が出てきますよ。さらにIF関数と組み合わせれば、変化の有無だけを表示することもできます。
=IF(BITXOR(A2, B2)=0, "変化なし", "要確認")
監査やコンプライアンスチェックで「先月から権限が変わったユーザーだけ抽出したい」というニーズに、シンプルに応えられますね。
変化したビットの詳細を確認する
差分の数値が「6」と出たとき、「どの権限が変わったのか」を確認するには2進数化が便利です。
=DEC2BIN(BITXOR(A2, B2), 4)
第2引数の「4」は表示桁数の指定です。結果が「0110」と出れば、「2桁目(編集)と3桁目(削除)が変わった」ことが一目で分かりますよ。
実務活用例3:パリティビット・チェックサムの計算
BITXORの「同じ値で2回XORすると元に戻る」性質は、データの誤り検出にも使われています。複数の数値を全部XORした結果を「パリティ」や「チェックサム」と呼び、簡易的なデータ整合性チェックに使えますよ。
REDUCEで複数値のXORを取る
A2:A10に並んだ数値の全XORを求めるには、REDUCE関数(範囲を畳み込む関数)と組み合わせます。
=REDUCE(0, A2:A10, LAMBDA(acc, val, BITXOR(acc, val)))
初期値0から始めて、A2〜A10の各セルとBITXORを取り続け、最終的にすべての値のXOR結果を返します。
| 入力値(A2:A6) | XORの累積結果 |
|---|---|
| 5 | 5 |
| 3 | 6 |
| 7 | 1 |
| 3 | 2 |
| 5 | 7 |
途中で「3」と「5」が2回ずつ登場していますが、最終的に残るのは「1回しか登場しなかった7」だけ。これがXORの面白い性質ですね。重複データの中から「ペアにならなかった1個」を見つけるテクニックとして使えますよ。
入出庫データの差分チェック
入庫リストと出庫リストの数値を全部XORして「結果が0なら全件ペア成立、0以外なら片側だけ存在する数値が残る」という整合性チェックにも応用できます。
=BITXOR(
REDUCE(0, 入庫!A2:A100, LAMBDA(a,v, BITXOR(a,v))),
REDUCE(0, 出庫!A2:A100, LAMBDA(a,v, BITXOR(a,v)))
)
完全な照合にはなりませんが、軽量な「1次チェック」としては十分実用的ですね。
BITXOR関数とExcelの互換性
GoogleスプレッドシートのBITXOR関数は、ExcelのBITXOR関数と仕様が同じです。構文・引数・有効範囲・エラー条件のすべてが一致しています。
ExcelファイルをGoogleスプレッドシートで開いた場合でも、BITXOR関数はそのまま動作します。逆にスプレッドシートで作成した数式をExcelで開いても問題ありませんよ。
ExcelのBITXOR関数はExcel 2013以降で利用できます。古いバージョンのExcelファイルを扱うときは、互換性に注意してくださいね。
エラーの種類と対処法
#NUM! エラー
次のいずれかに当てはまると #NUM! エラーになります。
- 引数に負の数を指定した
- 引数が
(2^48)-1(= 281,474,976,710,655)を超えている - 引数に小数を指定した
=BITXOR(-1, 2) → #NUM!(負の数は不可)
=BITXOR(2.5, 2) → #NUM!(小数は不可)
対処法は、INT関数で整数化してから渡すことです。
=BITXOR(INT(A1), INT(B1))
#VALUE! エラー
引数に文字列を指定すると #VALUE! エラーになります。MID関数などで取り出した文字列をそのまま渡すと発生しがちです。
対処法はVALUE関数(文字列を数値に変換する関数)で数値化することです。
=BITXOR(VALUE(A1), VALUE(B1))
#N/A エラー
引数が不足している場合は #N/A エラーになります。BITXORは引数2つが必須なので、片方しか渡していないと発生しますよ。
=BITXOR(5) → #N/A(引数不足)
エラー対処:IFERRORで包む
入力データが信頼できない場合は、IFERRORで包んでおくと安心です。
=IFERROR(BITXOR(A2, B2), 0)
エラー時に0を返すようにしておけば、後続の集計が止まらずに済みますよ。
他のビット演算関数との使い分け
スプレッドシートにはBITXOR以外にもビット演算関数が用意されています。場面に応じて使い分けましょう。
| 関数 | 演算 | 説明 | 使いどころ |
|---|---|---|---|
| BITXOR | XOR(排他的論理和) | 異なるビットだけ残す | フラグの切り替え(トグル)・差分検出 |
| BITOR | OR(論理和) | どちらか1のビットを残す | 権限の付与・フラグの合成 |
| BITAND | AND(論理積) | 両方1のビットだけ残す | 権限チェック・フラグ抽出 |
| BITLSHIFT | 左シフト | ビットを左にずらす | 値の2倍・4倍計算 |
| BITRSHIFT | 右シフト | ビットを右にずらす | 値の半分計算 |
BITXORは「変化させたい」「違いを取り出したい」とき、BITORは「足し合わせたい」とき、BITANDは「特定のフラグが立っているか確認する」ときに使います。詳しくはBITAND関数の記事やBITOR関数の記事も合わせて読むと、ビット演算3兄弟の役割が立体的に理解できますよ。
「付与にBITOR・確認にBITAND・切り替えにBITXOR」という役割分担を覚えておくと、業務で迷わず使い分けられますね。
まとめ
GoogleスプレッドシートのBITXOR関数は、2つの数値をビット単位でXOR演算する関数です。フラグの切り替え(トグル)や差分検出といった「変化」を扱う処理で大きな威力を発揮しますよ。
- 構文は
=BITXOR(値1, 値2)、引数は0以上の整数 - 「同じビットは0、違うビットは1」になるルールで差分が抽出できる
- 同じ値で2回XORすると元に戻る性質を使って、ON/OFFをトグル操作できる
- IF・ARRAYFORMULA・REDUCEと組み合わせて一覧を一括処理できる
- 月次の権限変更チェックや簡易チェックサムにも応用可能
- ExcelのBITXOR関数と完全互換(Excel 2013以降)
ビット演算は最初こそ難しく見えますが、BITXOR関数を使えば権限のトグルや差分検出がシンプルな数式で書けるようになります。まずは「BITXOR(現在の権限, 切り替えたい権限)」のパターンから試してみてくださいね。
