スプレッドシートのBIN2OCT関数の使い方|2進を8進に変換

スポンサーリンク

スプレッドシートで2進数のフラグや権限ビットを扱っていると、8進数に直したい場面が出てきます。BIN2OCT関数を見つけて試したものの、1111111111 を入れたら 7777777777 が返ってきて戸惑った人もいるでしょう。

仕組みを知らないまま使うと、負の数を正の数と取り違えたり、8進数の結果をそのまま足して合計を誤ったりしかねません。結果は数字だけなので、10進数と見分けがつかないのも厄介なところです。

この記事では、GoogleスプレッドシートのBIN2OCT関数の書き方を基本から整理します。桁数をそろえる0埋めや、10桁の負の数の読み方まで順に見ていきましょう。

エラー条件と結果の型は、2026年10月にGoogleスプレッドシートの検証用シートで実際に確かめた値をもとに解説していきますね。

スプレッドシートのBIN2OCT関数とは(構文と引数)

BIN2OCT関数は、2進数を8進数に変換するスプレッドシートのエンジニアリング関数です。読み方は「バイナリ・トゥ・オクタル」。BIN(Binary=2進数)から OCT(Octal=8進数)へ、という意味がそのまま名前になっています。

先に結論をまとめると、押さえるべき点は次の3つです。

  • 書き方は =BIN2OCT(2進数, [有効桁])
  • 受け付ける2進数は10桁(10ビット)まで
  • 結果は8進数の「テキスト(文字列)」で返る

逆に8進数を2進数へ戻したいときは、スプレッドシートのOCT2BIN関数を使いましょう。

構文と引数(significant_digits/Excel は places)

構文は次のとおりです。第2引数は省略できます。

=BIN2OCT(符号付き2進数, [有効桁])
引数必須/省略内容
符号付き2進数(signed_binary_number)必須変換したい2進数。0と1だけで10文字まで。10桁で先頭が1なら負の数として扱われる
有効桁(significant_digits)省略可結果の桁数。足りない分は左に0を補う。負の数のときは無視される

2進数は "1001" のようにダブルクォーテーションで囲んで渡すのが基本です。数値の 1001 をそのまま渡しても、文字列で渡したときと同じ「11」が返りました。公式ヘルプにも、有効な2進数なら文字列に自動変換されると書かれています。

「有効桁」はGoogle公式ヘルプでの呼び名で、Excelでは同じ第2引数を places と呼びます。Excelで使う人はExcelのBIN2OCT関数の使い方も参考にしてください。

2進数3桁=8進数1桁の対応表

2進数の3桁は、8進数の1桁にぴったり対応します。対応は次の8通りだけです。

2進数(3桁)8進数
0000
0011
0102
0113
1004
1015
1106
1117

たとえば 101011 は、右から3桁ずつ区切ると 101|011 です。それぞれを表に当てはめると「5」「3」となり、8進数では「53」になります。

BIN2OCT関数は、この区切りと置き換えを自動でやってくれる関数だと考えるとわかりやすいでしょう。

BIN2OCT関数の基本の使い方と桁数指定

ここからは、実際の書き方を見ていきます。直接入力・セル参照・ARRAYFORMULAの3つを押さえれば、たいていの場面に対応できます。

直接入力・セル参照で変換する

いちばんシンプルなのは、2進数を直接書く方法です。

=BIN2OCT("1001")    → 11
=BIN2OCT("11111")   → 37
=BIN2OCT(A2)        → A2の2進数を8進数に変換

1001 の結果は「11」でした。これは10進数の「じゅういち」ではありません。8進数の「1・1」で、10進数に直すと9にあたります。

実務ではセルに入った2進数を変換することが多いはずです。A2に2進数があるなら =BIN2OCT(A2) と書き、下の行へコピーしていきましょう。

ARRAYFORMULAでまとめて変換する(空白セルの除外)

行数が多いときは、ARRAYFORMULAで1つの数式にまとめると管理が楽です。ただし範囲に空白セルが混ざると、その行だけ #VALUE! になります。

そこで、空白を IF で除外する書き方を標準形にしておくのがおすすめです。

=ARRAYFORMULA(IF(A2:A6="","",BIN2OCT(A2:A6,3)))
A列(2進数)B列(結果)
1001011
(空白)(空欄のまま)
11003
111101101755
110100100644

IF を付けずに =ARRAYFORMULA(BIN2OCT(A2:A6,3)) と書いた場合も見ておきましょう。配列全体はエラーにならず、空白の行だけに #VALUE! が出て見た目が崩れます。

桁数を指定して0埋めする(足りないと#NUM!)

第2引数の有効桁を指定すると、結果の左側に0を補って桁数をそろえられます。一覧表で縦の並びを整えたいときに便利です。

数式結果ポイント
=BIN2OCT("1001",3)0113桁にそろう
=BIN2OCT("11111",8)000000378桁にそろう
=BIN2OCT("1001",10)000000001110桁まで指定できる
=BIN2OCT("1001",2.9)11小数は切り捨てて2桁扱い
=BIN2OCT("11111111",2)#NUM!377は3桁必要なので足りない

注意したいのは、有効桁が結果の桁数より小さいと #NUM! になる点です。11111111 は8進数で「377」なので、2桁には収まりません。

有効桁に指定できるのは1〜10の範囲です。0や-1、11を入れると #NUM! になりました。

実務例: Unixパーミッション(755・644)を3桁で出す

8進数の身近な例が、LinuxやmacOSのファイルパーミッションです。chmod 755 のような表記を見たことがある人も多いでしょう。

パーミッションは「読み取り(r)・書き込み(w)・実行(x)」の3ビットが1組です。所有者・グループ・その他の3組で、合計9ビットになります。

2進数(9ビット)=BIN2OCT(A2,3)表記意味
111101101755rwxr-xr-x所有者は全権限、他は読み取りと実行
110100100644rw-r–r–所有者は読み書き、他は読み取りのみ
111000000700rwx——所有者だけが使える
111111111777rwxrwxrwx全員が全権限

有効桁を3にしておくのがコツです。たとえば 000100100 は、指定しないと「44」になってしまいます。3を指定すれば「044」となり、パーミッションらしい3桁表記で並びます。

9ビットのデータは先頭が1でも正の数として扱われるので、パーミッションの変換で負の数が出る心配はありません。

負の数の扱い(10桁の2の補数)

BIN2OCT関数でいちばん戸惑いやすいのが、10桁の入力です。10桁の2進数は「符号付き」として読まれ、先頭のビットが符号を表します。

負の数は「2の補数」というコンピュータの表し方で扱われます。仕組みを細かく覚えなくても、次の読み方表さえ押さえれば困りません。

先頭が1の10桁だけが負になる(読み方表)

2進数桁数10進数の値BIN2OCTの結果
011111111110+511(正の最大)777
100000000010-512(負の最小)7777777000
111111111010-27777777776
111111111110-17777777777
1111111119+511777

ルールはシンプル。10桁ちょうどで、しかも先頭が1のときだけ負の数になります。9桁以下なら先頭が1でも正の数のままです。

1111111111 と 111111111 は、1の数が1つ違うだけです。それなのに、結果は「7777777777」と「777」でまったく違います。データの桁数がそろっていない列では、この差に気づきにくいので注意しましょう。

負の数の結果が7だらけになるのは、BIN2OCTが負の数を10桁の8進数で返すためです。10桁の8進数は30ビット分にあたり、符号の1が左側の空きをすべて埋めます。1が3つ並べば8進数の7なので、左側が7で埋まるわけです。

10進数でいくつにあたるかを確かめたいときは、スプレッドシートのBIN2DEC関数で同じ2進数を変換してみてください。

負の数は桁数指定が無視されて常に10桁

負の数のときは、有効桁の指定が無視されます。結果は常に10桁です。

=BIN2OCT("1111111111",4)   → 7777777777
=BIN2OCT("1000000000",2)   → 7777777000
=BIN2OCT("11111111",2)     → #NUM!

正の数なら有効桁が足りないと #NUM! になりますが、負の数ではエラーにもなりません。有効桁を3にそろえた列に10桁の結果が混ざっていたら、元データに負の数として読まれた値がある合図です。

BIN2OCT関数のエラーと対処法

BIN2OCT関数で出るエラーは、主に #NUM! と #VALUE! の2種類です。おおまかには「2進数として読めない・桁が合わない」なら #NUM! になります。「型が違う」なら #VALUE! と覚えておくと整理しやすいでしょう。

#NUM!・#VALUE!のエラー条件早見表

公式ヘルプが書いていない入力も含めて、検証用シートで確かめた結果を1つの表にまとめました。

数式・入力結果原因
=BIN2OCT("00000000001")#NUM!11文字以上(先頭が0でも不可)
=BIN2OCT("102")#NUM!0と1以外の数字が入っている
=BIN2OCT("ABC")#NUM!アルファベットも0と1以外の扱い
=BIN2OCT("0b1010")#NUM!「0b」のような接頭辞は使えない
=BIN2OCT(" 1001")#NUM!先頭に空白がある
=BIN2OCT("1010.1")#NUM!小数点が入っている
=BIN2OCT(-1)#NUM!マイナス記号付きの数値
=BIN2OCT("11111111",2)#NUM!有効桁が結果の桁数より小さい
=BIN2OCT("1001",0)#NUM!有効桁が0(-1・11も同じ)
=BIN2OCT("1001","abc")#VALUE!有効桁が文字列
=BIN2OCT(Z1)(Z1は空白)#VALUE!空白セルを参照している
=BIN2OCT(TRUE)#VALUE!論理値を渡している
=BIN2OCT("")0空文字はエラーにならない

見落としやすいのは「ABC」です。アルファベットを入れても #VALUE! ではなく #NUM! になります。

負の数を入れたいときも、-1 のようにマイナスを付けると #NUM! になります。負の数は、10桁の2の補数(-1なら 1111111111)で渡しましょう。

空白の扱いにも差があります。空白セルを参照すると #VALUE! ですが、空文字 "" を直接渡すと「0」が返りました。ARRAYFORMULAの例で IF を使って空白を除外したのは、このためです。

IFERROR・REGEXMATCHで事前に防ぐ

大量のデータを変換するなら、エラー表示を目立たなくする工夫をしておくと安心です。手軽なのは IFERROR で代わりの文字を出す方法でしょう。

=IFERROR(BIN2OCT(A2,3),"変換不可")

ただし IFERROR は、有効桁の指定ミスまで「変換不可」に隠してしまいます。入力値そのものをチェックしたいなら、REGEXMATCH で事前に判定するほうが原因を切り分けやすくなります。

=IF(REGEXMATCH(TO_TEXT(A2),"^[01]{1,10}$"),BIN2OCT(A2,3),"2進数ではありません")

^[01]{1,10}$ は「0と1だけが1〜10文字並ぶ」という意味の正規表現です。0と1以外の文字や11文字以上の入力、空白・接頭辞・小数点はまとめて弾けます。

TO_TEXT を挟んでいるのは、セルに数値として入った2進数もテキストとして判定するためです。数値の1001をTO_TEXTで変換した場合も、判定はTRUEになりました。

なお、有効桁を3にしておけば、正の数で桁不足が起きることはありません。10ビットの正の最大値は「777」で、ちょうど3桁に収まるからです。

結果を計算に使うときの注意と10桁超の変換

BIN2OCTの結果は数字だけで構成されるので、つい普通の数値として計算したくなります。ところが、そのまま足し算に使うと誤った値が出てしまいます。

8進数の結果をそのまま足すと誤る

まず確認しておきたいのが、結果がテキストだという点です。=ISTEXT(BIN2OCT("1001001")) は TRUE を返しました。

そのうえで、8進数の「111」(10進数の73)に9を足す例を見てみましょう。

=BIN2OCT("1001001")+9                     → 120(誤り)
=DEC2OCT(OCT2DEC(BIN2OCT("1001001"))+9)   → 122(正しい)

1つ目は、8進数の111を10進数の111として足しています。そのため120という、8進数としては誤った値になりました。Google公式ヘルプも、この点に注意を促しています。

正しく計算するには、OCT2DECで10進数に直してから足し、DEC2OCTで8進数に戻します。73+9=82で、82を8進数にすると「122」です。戻し方の詳細はスプレッドシートのDEC2OCT関数で解説しています。

範囲の合計でも同じ落とし穴があります。E1〜E3に 1001・111・1000 を変換した結果(11・7・10)が入っているとしましょう。

数式結果判定
=SUM(E1:E3)0誤り。SUMはテキストを無視する
=E1+E2+E328誤り。10進数として足している
=DEC2OCT(OCT2DEC(E1)+OCT2DEC(E2)+OCT2DEC(E3))30正しい(9+7+8=24を8進数にした値)

SUMの0はエラーが出ないぶん、気づきにくいのが困りもの。合計は、10進数で足してからDEC2OCTで8進数に戻すのが確実です。元の2進数が残っていれば、BIN2DECで10進数にして足す方法も使えます。

10桁を超える2進数はBASE+DECIMALで変換

BIN2OCTは11文字以上を受け付けません。12桁や16桁の2進数を8進数にしたいときは、DECIMALで10進数にしてから、BASEで8進数に変換します。

=BASE(DECIMAL("111111111111",2),8)   → 7777
=BASE(DECIMAL("101",2),8,3)          → 005

DECIMALの第2引数「2」は元の基数、BASEの第2引数「8」は変換先の基数です。BASEの第3引数で最小の桁数を指定すると、BIN2OCTの有効桁と同じように左側を0で埋められるのも便利なところ。

この方法は符号を考えずに変換するので、12個の1を並べても正の「7777」になります。結果がテキストで返る点はBIN2OCTと同じなので、計算に使うときは前の節と同じ注意が必要です。

それぞれの使い方は、スプレッドシートのDECIMAL関数とスプレッドシートのBASE関数で詳しく紹介しています。

BIN2OCTと関連関数の使い分けとまとめ

最後に、BIN2OCTと組み合わせて使うことの多い関数を整理しておきます。目的に合わせて使い分けてみてください。

OCT2BIN・BIN2DEC・DEC2OCT・HEX2OCT・BASE/DECIMALの使い分け

関数変換の向きこんなときに使う
BIN2OCT(この記事)2進数 → 8進数10桁以内の2進数を8進数で見たい
OCT2BIN8進数 → 2進数逆変換。8進数の値をビットで確認したい
BIN2DEC2進数 → 10進数負の数の値を確かめたい・合計を出したい
DEC2OCT10進数 → 8進数10進数で計算した結果を8進数に戻したい
HEX2OCT16進数 → 8進数元データが16進数のとき
BASE/DECIMAL任意の基数どうし10桁を超える2進数を変換したい

迷ったら、まず桁数を見ましょう。10桁以内で負の数も扱うならBIN2OCT、10桁を超えるならBASE+DECIMALが目安です。計算が絡むときは、いったん10進数に直すのが基本です。

まとめ

スプレッドシートのBIN2OCT関数のポイントをおさらいします。

  • 構文は =BIN2OCT(2進数, [有効桁])。有効桁は1〜10で、不足すると #NUM!
  • 10桁で先頭が1のときだけ負の数になり、結果は有効桁を無視した10桁(-1なら7777777777)
  • 「ABC」も11文字の入力も #NUM!。空白セル参照は #VALUE! なので、ARRAYFORMULAではIFで除外する
  • 結果はテキスト。SUMは0になり、そのまま足すと10進数として計算されるため、OCT2DEC・DEC2OCTを経由する

まずは =BIN2OCT("1001",3) で「011」が返るのを試してみてください。そこから負の数やエラーの表を手元のデータと見比べていけば、変換結果に迷うことはぐっと減るはずです。

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