「スプレッドシートの関数一覧でBITXORを見かけたけど、何をする関数なの?」と戸惑ったことはありませんか。名前に「BIT」と付いているだけで、ちょっと身構えてしまいますよね。
他の人が作った管理表にBITXORが入っていると、中身が分からないまま触れずに放置しがちです。数式を直したくても、2進数の話が出てきた時点で手が止まってしまうことも。
でも大丈夫。BITXORは「2つの数値を比べて、違う桁だけを1にする」関数で、覚えるルールはこれだけです。この記事では、GoogleスプレッドシートのBITXOR関数を、DEC2BINで2進数を並べながら解説します。
後半では、フラグのON/OFF切り替えや先月との違い探しといった使い方、エラーの対処もまとめました。2進数が苦手な方も、表を見比べながら読み進めてみてくださいね。
スプレッドシートのBITXOR関数とは?(違う桁だけ1になる)
まずは結論から。スプレッドシートで次のように入力すると、結果は「6」になります。
=BITXOR(5, 3) → 6
5は2進数で 101、3は 011 です。右から1桁ずつ比べて、違う桁だけを1にすると 110、つまり10進数の6になるわけですね。
BITXORは「ビット・エックスオア」と読みます。XORは「排他的論理和(はいたてきろんりわ)」のことで、2つのうち片方だけが1のときに1を返す計算です。1桁ごとの結果は、次の4パターンしかありません。
| 値1の桁 | 値2の桁 | 結果 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
「同じなら0、違えば1」と覚えておけばOK。構文は次のとおりで、引数は2つとも必須です。
=BITXOR(値1, 値2)
| 引数 | 内容 |
|---|---|
| 値1 | 比べる1つ目の数値(0以上の整数) |
| 値2 | 比べる2つ目の数値(0以上の整数) |
Google公式ヘルプによると、引数の順番を入れ替えても結果は変わりません。=BITXOR(3, 5) と書いても、同じく6が返りますよ。
基本の使い方:DEC2BINで2進数を並べて確認する
BITXORの結果は10進数で返るため、そのままでは「どの桁が1になったのか」が見えません。そこで、DEC2BIN関数で2進数に直して横に並べるのがおすすめです。
数値・セル参照で指定する
引数には、数値を直接書いてもセルを参照してもかまいません。A2とB2に数値が入っているなら、E2に次のように入力しましょう。
=BITXOR(A2, B2)
2進数の見た目も確認したいときは、C列・D列・F列にDEC2BINを入れます。第2引数の「8」は、8桁になるよう左側を0で埋める指定です。
C2: =DEC2BIN(A2, 8)
D2: =DEC2BIN(B2, 8)
F2: =DEC2BIN(BITXOR(A2, B2), 8)
5組の数値で並べると、次のような表になります。
| A(値1) | B(値2) | C:DEC2BIN(A) | D:DEC2BIN(B) | E:BITXOR | F:DEC2BIN(結果) |
|---|---|---|---|---|---|
| 5 | 3 | 00000101 | 00000011 | 6 | 00000110 |
| 10 | 6 | 00001010 | 00000110 | 12 | 00001100 |
| 7 | 4 | 00000111 | 00000100 | 3 | 00000011 |
| 0 | 9 | 00000000 | 00001001 | 9 | 00001001 |
| 5 | 5 | 00000101 | 00000101 | 0 | 00000000 |
C列とD列を上下に見比べると、違う桁だけがF列で1になっているのが分かりますね。0と9のように片方が0なら、もう片方の値がそのまま返ります。
5と5のように同じ値同士なら、結果は必ず0。この「同じなら0」が、後で紹介する差分検出の土台になります。
なお、DEC2BINの結果は文字列なので、そのまま計算には使いません。2進数で考えた値をBITXORに渡すなら、BIN2DEC関数で10進数に戻しましょう。
=BITXOR(A2, BIN2DEC("0010"))
桁数の多い値を2進数で見たいときは、BASE関数も使えます。
ARRAYFORMULAで行ごとにまとめて計算する
行が多いときは、数式を1行ずつコピーする代わりにARRAYFORMULAでまとめて計算できます。E2に次の数式を入れると、2〜6行目の結果が一度に表示されますよ。
=ARRAYFORMULA(BITXOR(A2:A6, B2:B6))
2進数の表示もまとめたいなら、DEC2BINごと包みます。
=ARRAYFORMULA(DEC2BIN(BITXOR(A2:A6, B2:B6), 8))
結果が広がる先のセルに値が入っていると、展開できずエラーになります。数式を入れる列の下側は空けておいてください。
実務での使い方:フラグの切り替えと差分検出
BITXORが活躍するのは、1つの数値に複数のON/OFFを詰め込んだ「フラグ」を扱う場面です。たとえば、共有フォルダの権限を次のルールで数値にしているとします。
| 桁(右から) | 権限 | 10進数 | 2進数 |
|---|---|---|---|
| 1桁目 | 閲覧 | 1 | 0001 |
| 2桁目 | 編集 | 2 | 0010 |
| 3桁目 | 削除 | 4 | 0100 |
| 4桁目 | 管理 | 8 | 1000 |
持っている権限の値を足したものが、その人の権限値です。「3」なら閲覧+編集、「11」なら閲覧+編集+管理(1+2+8)ですね。
ON/OFFを切り替える(同じ値で2回かけると元に戻る)
A2に権限値が入っていて、編集権限(2)だけを切り替えたいなら、次の数式を使います。
=BITXOR(A2, 2)
A2が「3」(閲覧+編集)なら結果は「1」になり、編集だけがOFFになります。A2が「1」なら結果は「3」で、今度は編集がONに。同じ数式で、今の状態を反転できるのがポイントです。
同じ値で2回BITXORすると、元の値に戻ります。
| 段階 | 数式 | 結果 | 2進数 |
|---|---|---|---|
| 元の値 | − | 3 | 0011 |
| 1回目 | =BITXOR(3, 2) | 1 | 0001 |
| 2回目 | =BITXOR(1, 2) | 3 | 0011 |
複数の権限をまとめて切り替えることもできます。閲覧(1)と削除(4)なら、合計の5を渡しましょう。=BITXOR(3, 5) は6となり、閲覧がOFF・削除がONに切り替わります。
ちなみに、BITOR関数で2を合わせると、すでに編集がONの値は変わりません(=BITOR(3, 2) は3)。「必ずONにしたい」ならBITOR、「今の状態を反転したい」ならBITXORと使い分けてください。
先月と今月の値の違いを見つける
BITXORは「違う桁だけ1」なので、2つの値の差分探しにも使えます。B列に先月、C列に今月の権限値を並べた例で見てみましょう。D2に =BITXOR(B2, C2)、E2に =DEC2BIN(D2, 4) を入れています。
| A:社員 | B:先月 | C:今月 | D:BITXOR | E:DEC2BIN | 変わった権限 |
|---|---|---|---|---|---|
| 田中 | 3 | 7 | 4 | 0100 | 削除 |
| 鈴木 | 5 | 5 | 0 | 0000 | なし |
| 佐藤 | 7 | 3 | 4 | 0100 | 削除 |
| 山田 | 1 | 11 | 10 | 1010 | 編集・管理 |
D列が0なら変化なし、0以外なら変わった桁があります。変化の有無だけを表示したいなら、IF関数と組み合わせましょう。
=IF(BITXOR(B2, C2)=0, "変化なし", "要確認")
ただ、BITXORだけでは「付いたのか外れたのか」までは分かりません。田中さんと佐藤さんはどちらも4ですが、田中さんは削除権限が付き、佐藤さんは外れています。
向きを知りたいときは、BITAND関数を重ねてみましょう。
付いた権限:=BITAND(C2, BITXOR(B2, C2))
外れた権限:=BITAND(B2, BITXOR(B2, C2))
田中さんは「付いた権限」が4、佐藤さんは「外れた権限」が4になります。山田さんは「付いた権限」が10で、編集と管理が新しく付いたと読めますね。
エラーが出るときの原因と対処
Google公式ヘルプには、扱える数値の上限やエラーの種類が書かれていません。スプレッドシートでの動きを、エラーにならない例も含めて表にまとめました。
| 入力の例 | 結果 | ポイント |
|---|---|---|
=BITXOR(-1, 2) | #NUM! | 負の数は使えない |
=BITXOR(2^48, 1) | #NUM! | 2の48乗以上は使えない |
=BITXOR(2^48-1, 0) | 281474976710655 | 2の48乗−1までは計算できる |
=BITXOR(2.5, 2) | #NUM! | 小数は切り捨てられずエラー |
=BITXOR("abc", 2) | #VALUE! | 数字以外の文字列 |
=BITXOR("5", 2) | 7 | 数字の文字列は数値扱い |
=BITXOR(TRUE, 2) | 3 | TRUEは1として扱われる |
| 空白セルと2 | 2 | 空白は0として扱われる |
=BITXOR(5) | #N/A | 引数が1つだけ |
=BITXOR(5, 3, 1) | #N/A | 引数が3つ |
いちばん出会いやすいのは、割り算の結果などで小数が混じったときの#NUM!でしょう。INT関数で整数にしてから渡すと解決します。
=BITXOR(INT(A2), INT(B2))
#VALUE!は「5件」のように、数字と文字が混ざったセルで起きがちです。”5″ のような数字だけの文字列は計算できるので、元データに余計な文字がないか確認しましょう。
入力が信用できない表では、IFERRORで包んでおくと安心です。差分検出では0が「変化なし」の意味になるため、エラー時は0ではなく文字を返すのがおすすめ。
=IFERROR(BITXOR(A2, B2), "要確認")
ほかのビット演算関数との使い分け・Excelとの互換性
スプレッドシートには、BITXOR以外にもビット演算の関数があります。役割を表で整理しておきましょう。
| 関数 | 何をするか | 主な使いどころ |
|---|---|---|
| BITXOR | 違う桁だけ1にする | ON/OFFの切り替え・差分検出 |
| BITAND | 両方1の桁だけ1にする | フラグが立っているかの確認 |
| BITOR | どちらかが1の桁を1にする | フラグをONにする・合成する |
| BITLSHIFT | 桁を左にずらす | 2倍・4倍の計算、フラグの位置の生成 |
| BITRSHIFT | 桁を右にずらす | 2分の1の計算、上位の桁の取り出し |
同じ5と3で比べると、違いがよく分かります。
=BITAND(5, 3) → 1(001)
=BITOR(5, 3) → 7(111)
=BITXOR(5, 3) → 6(110)
「確認はBITAND、ONにするのはBITOR、切り替えと違い探しはBITXOR」と覚えておけば迷いませんよ。
対応バージョン: Googleスプレッドシートは、ブラウザ版・アプリ版のどちらでも利用可能です。ExcelのBITXOR関数は、Microsoft公式の関数ページでExcel 2016以降・Microsoft 365などが対象に挙がっています(それより前のバージョンは公式ページから確認できませんでした)。
ExcelでもBITXOR関数は同じ構文で使えます。=BITXOR(5, 3) が6になる例は、Microsoft公式にも載っています。ただし、細かな挙動まですべて同じとは限りません。
たとえばGoogle公式は、”3″ のような数字の文字列やTRUEを数値として扱うと明記しています。一方、Excel公式は「数値以外は#VALUE!」と書いているだけです。
Excelで使う場合の注意点は、ExcelのBITXOR関数の記事にまとめています。
まとめ
GoogleスプレッドシートのBITXOR関数は、2つの数値を2進数で比べ、違う桁だけを1にする関数です。最後にポイントを振り返っておきましょう。
- 構文は
=BITXOR(値1, 値2)。引数は2つとも必須で、0以上の整数を渡す =BITXOR(5, 3)は6。DEC2BINで2進数を並べると、どの桁が1になったかが見える- 同じ値で2回かけると元に戻るので、フラグのON/OFF切り替えに使える
- 先月と今月の値をBITXORして0なら変化なし。付いたか外れたかはBITANDで確認
- 負の数・小数は#NUM!、数字以外の文字列は#VALUE!。小数はINTで整数にしてから渡す
まずは手元のシートで、=BITXOR(5, 3) と =DEC2BIN(BITXOR(5, 3), 8) を並べてみてください。「違う桁だけ1」の動きが目で確かめられると、フラグの切り替えや差分探しにもすっと応用できますよ。
