スプレッドシートのBITXOR関数の使い方|違うビットだけ1にしてフラグを切り替える

スポンサーリンク

「スプレッドシートの関数一覧で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の桁結果
000
011
101
110

「同じなら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:BITXORF:DEC2BIN(結果)
530000010100000011600000110
10600001010000001101200001100
740000011100000100300000011
090000000000001001900001001
550000010100000101000000000

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桁目閲覧10001
2桁目編集20010
3桁目削除40100
4桁目管理81000

持っている権限の値を足したものが、その人の権限値です。「3」なら閲覧+編集、「11」なら閲覧+編集+管理(1+2+8)ですね。

ON/OFFを切り替える(同じ値で2回かけると元に戻る)

A2に権限値が入っていて、編集権限(2)だけを切り替えたいなら、次の数式を使います。

=BITXOR(A2, 2)

A2が「3」(閲覧+編集)なら結果は「1」になり、編集だけがOFFになります。A2が「1」なら結果は「3」で、今度は編集がONに。同じ数式で、今の状態を反転できるのがポイントです。

同じ値で2回BITXORすると、元の値に戻ります。

段階数式結果2進数
元の値−30011
1回目=BITXOR(3, 2)10001
2回目=BITXOR(1, 2)30011

複数の権限をまとめて切り替えることもできます。閲覧(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:BITXORE:DEC2BIN変わった権限
田中3740100削除
鈴木5500000なし
佐藤7340100削除
山田111101010編集・管理

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)2814749767106552の48乗−1までは計算できる
=BITXOR(2.5, 2)#NUM!小数は切り捨てられずエラー
=BITXOR("abc", 2)#VALUE!数字以外の文字列
=BITXOR("5", 2)7数字の文字列は数値扱い
=BITXOR(TRUE, 2)3TRUEは1として扱われる
空白セルと22空白は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」の動きが目で確かめられると、フラグの切り替えや差分探しにもすっと応用できますよ。

タイトルとURLをコピーしました