「権限フラグの値(1, 2, 4, 8, 16…)を順番に自動生成したい…」「2の累乗をシンプルな数式で出したい…」
スプレッドシートで権限管理台帳やビットフラグの設計をしていると、「2の累乗を並べた一覧がほしい」「特定のビット位置に1を立てたい」といった場面が出てきますよね。=POWER(2, n) でも書けますが、ビット演算の文脈ではもう少し直感的な書き方がほしくなります。
そんなときに便利なのがGoogleスプレッドシートのBITLSHIFT関数です。指定した数値のビットを左にずらすだけで、「値を2倍・4倍・8倍する」「特定の位置にフラグを立てる」といった処理を一発でこなせますよ。
しかも結果は数値型で返るので、BITANDやBITORと組み合わせてフラグ管理の仕組みをスマートに組み立てられます。Excelとも互換性があるため、ファイルをやり取りする現場でも安心して使えますね。
この記事では、スプレッドシートのBITLSHIFT関数の基本から2倍系列の生成・フラグ位置の動的生成・データパッキングまで解説します。BITRSHIFT・BITAND・BITORとの使い分けやエラー対処法にも触れていきますよ。
BITLSHIFT関数とは?
スプレッドシートのBITLSHIFT関数(ビットレフトシフト関数)は、指定した数値のビットを左方向に指定した桁数だけずらす関数です。結果は10進数の数値で返ります。
「ビットを左にずらす」とは、数値を2進数に変換して、各ビットを左に移動させる計算のことです。空いた右側には0が入ります。1桁左にずらすたびに値が2倍になるのが大きな特徴ですよ。
たとえば、5を2桁左にシフトする場合を見てみましょう。
- 5 を2進数にすると →
00000101 - 2桁左にシフト →
00010100(= 10進数の20)
5 × 2 × 2 = 20 という計算になっていますね。「左に1桁シフト = 2倍」と覚えると感覚がつかみやすいですよ。
GoogleスプレッドシートのBITLSHIFT関数は、ExcelのBITLSHIFT関数と同じ構文で使えます。2の累乗計算やビットフラグの位置生成など、ビット演算を扱う業務でじわじわ効いてくる関数ですね。
BITLSHIFT関数の書き方(構文と引数)
基本構文
=BITLSHIFT(値, シフト量)
引数は2つとも必須です。省略するとエラーになります。
引数の詳細
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 値 | 必須 | 左シフトする対象の数値(0以上の整数) |
| シフト量 | 必須 | 左にずらすビット数(-53〜53の整数) |
第1引数の「値」には、0以上かつ(2^48)-1(= 281,474,976,710,655)以下の整数を指定します。
第2引数の「シフト量」は通常は正の整数を指定して左シフトしますが、負の値を指定すると右シフト(BITRSHIFTと同じ動き)になります。シフト量の絶対値は53以下である必要がありますよ。
TIP
BITLSHIFT関数はExcelとの互換性があるため、ExcelファイルをGoogleスプレッドシートで開いてもそのまま動作します。逆もまた然りです。バージョン違いで挙動が変わる心配はいりませんよ。
ビット左シフトのイメージ表
BITLSHIFT関数の動きをイメージしやすいように、よく使う組み合わせを表にまとめました。
| 値 | シフト量 | 値(2進) | シフト後(2進) | 結果(10進) | 倍率 |
|---|---|---|---|---|---|
| 1 | 0 | 0001 | 0001 | 1 | ×1 |
| 1 | 1 | 0001 | 0010 | 2 | ×2 |
| 1 | 2 | 0001 | 0100 | 4 | ×4 |
| 1 | 3 | 0001 | 1000 | 8 | ×8 |
| 3 | 2 | 0011 | 1100 | 12 | ×4 |
| 5 | 3 | 0101 | 101000 | 40 | ×8 |
| 7 | 4 | 0111 | 1110000 | 112 | ×16 |
「シフト量が1増えるたびに結果が2倍になる」というルールが見えてきますね。BITLSHIFT(値, n) は 値 × 2^n と同じ結果を返します。
このルールから、BITLSHIFTには次の2つの代表的な使い道が生まれます。
- 2倍系列の高速生成:
BITLSHIFT(1, n)で 1, 2, 4, 8, 16… の2の累乗を順番に作れる - ビット位置の指定: 「nビット目に1を立てた値」を直接生成できる(権限フラグの動的生成)
この特徴を活かすと、ビットフラグ設計や権限管理がぐっと楽になりますよ。
BITLSHIFT関数の基本的な使い方
数値を直接指定する
もっともシンプルな使い方から見ていきましょう。
=BITLSHIFT(5, 2)
結果は「20」です。先ほどの説明のとおり、5を2桁左にシフトすると 00010100(= 20)になります。5 × 4 = 20 と同じ結果ですね。
=BITLSHIFT(1, 3)
結果は「8」です。1を3桁左にシフトすると 1000(= 8)になります。これは「4桁目(左から数えて4番目のビット)に1を立てる」操作と同じ意味ですよ。
セル参照で指定する
実務では、セルに入っている値をシフトする場面が多いです。A2に「3」、B2に「2」が入っている場合は次のように書きます。
=BITLSHIFT(A2, B2)
結果は「12」です。3を2桁左にシフトすると 1100(= 12)になります。3 × 4 = 12 と同じですね。
途中の2進数表現を確認したいときは、DEC2BIN関数(10進数を2進数の文字列に変換する関数)を組み合わせると分かりやすいですよ。
=DEC2BIN(A2) → "11"
=DEC2BIN(BITLSHIFT(A2, B2)) → "1100"
ARRAYFORMULAで一括シフトする
スプレッドシートならではの強みが、ARRAYFORMULA関数との組み合わせです。
=ARRAYFORMULA(BITLSHIFT(1, A2:A10))
A列に並んだシフト量に応じて、1を順番に左シフトした結果を一括で取得できます。
| A列: シフト量 | 結果(BITLSHIFT) |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
| 4 | 16 |
| 5 | 32 |
| 6 | 64 |
| 7 | 128 |
2の累乗の一覧が、1つの数式で完成しますよ。権限フラグの基本値リストや、kB→MB→GBといった2の累乗単位の換算表を作るときにも便利ですね。
実務活用例1:権限フラグの位置を動的に生成する
BITLSHIFT関数のもっとも代表的な活用が、ビットフラグの位置を動的に生成する使い方です。
権限ビットの設計例
たとえば、社内システムの権限を以下のようにビットフラグで管理しているとします。
| ビット位置 | 権限 | 値(10進) | 値(2進) |
|---|---|---|---|
| 0桁目 | 閲覧 | 1 | 0001 |
| 1桁目 | 編集 | 2 | 0010 |
| 2桁目 | 削除 | 4 | 0100 |
| 3桁目 | 管理 | 8 | 1000 |
このとき、各権限の値(1, 2, 4, 8)を手で入力する代わりに、BITLSHIFTで生成すると将来権限が増えても拡張しやすくなりますよ。
ビット位置から値を生成する
「nビット目に1を立てた値がほしい」という場合は、BITLSHIFT(1, n) で一発です。
=BITLSHIFT(1, 0) → 1(閲覧)
=BITLSHIFT(1, 1) → 2(編集)
=BITLSHIFT(1, 2) → 4(削除)
=BITLSHIFT(1, 3) → 8(管理)
権限名とビット位置の対応表だけ作っておけば、値は自動で算出できます。
| A列: 権限名 | B列: ビット位置 | C列: 値 =BITLSHIFT(1, B2) |
|---|---|---|
| 閲覧 | 0 | 1 |
| 編集 | 1 | 2 |
| 削除 | 2 | 4 |
| 管理 | 3 | 8 |
| エクスポート | 4 | 16 |
| インポート | 5 | 32 |
新しい権限「ダウンロード」を追加する場合も、ビット位置「6」を入れるだけで値「64」が自動算出されますね。
NOTE
BITLSHIFTで「位置」を作り、BITORで「合成」、BITANDで「チェック」、BITXORで「トグル」と覚えておくと、ビット演算4兄弟の役割分担がスッキリします。BITLSHIFTは権限の「番地」を決める設計フェーズで活躍しますよ。
BITORと組み合わせて権限を合成する
ビット位置から値を生成できれば、BITOR関数で複数の権限を合成するのも自動化できます。
=BITOR(BITLSHIFT(1, 0), BITLSHIFT(1, 1), BITLSHIFT(1, 2))
結果は「7」(閲覧+編集+削除)です。0001 OR 0010 OR 0100 = 0111 ですね。
権限名から値を組み立てる仕組みを作っておけば、運用担当者がビット位置を意識せず権限設定できるようになりますよ。詳しくはBITOR関数の記事も合わせて読んでみてくださいね。
実務活用例2:2倍系列の単位変換表を作る
BITLSHIFTは「1桁シフト = ×2」という性質から、2の累乗を扱う単位変換にぴったりです。
データ容量の単位変換
データ容量は基本的に2の10乗(= 1024)ごとに単位が変わります。1KB = 1024バイト、1MB = 1024KB、1GB = 1024MB のように、各単位は前の単位を1024倍した値ですよ。
これを BITLSHIFT で表すと、「10ビット左シフト = 1024倍」になります。
=BITLSHIFT(1, 10) → 1024(1KB = 1024B)
=BITLSHIFT(1, 20) → 1048576(1MB = 1024KB)
=BITLSHIFT(1, 30) → 1073741824(1GB = 1024MB)
=BITLSHIFT(1, 40) → 1099511627776(1TB = 1024GB)
シフト量を10ずつ増やすだけで、KB→MB→GB→TBの段階が自動で出てきますね。換算表を作るときに便利な書き方です。
バイト数からKB・MB・GBを表示する
「バイト単位のファイルサイズをKB・MB・GBに換算したい」という場面なら、BITRSHIFT関数(右シフト関数)と組み合わせます。
=BITRSHIFT(A2, 10) → KB単位(バイトを1024で割る)
=BITRSHIFT(A2, 20) → MB単位(バイトを1024×1024で割る)
=BITRSHIFT(A2, 30) → GB単位(バイトを1024×1024×1024で割る)
A2に「2147483648」(= 2GB相当のバイト数)が入っていれば、BITRSHIFT(A2, 30) の結果は「2」になりますよ。BITLSHIFTとBITRSHIFTは「左右ペア」の関係で、合わせて覚えておくと便利ですね。
実務活用例3:複数の値を1つの数値にパッキングする
BITLSHIFTを使うと、複数の小さな数値を1つの大きな数値にまとめて格納できます。色コード(RGB値)や日付の年月日コードなど、「複数の情報を1つの値で持ちたい」場面で活躍しますよ。
RGB値を1つの数値にまとめる
色を表すRGB値は、それぞれ赤・緑・青を0〜255の数値で持ちます。これを1つの整数にまとめるには、各値を8ビットずつ左シフトしてからBITORで合成します。
=BITOR(BITLSHIFT(A2, 16), BITLSHIFT(B2, 8), C2)
A2に赤(R=255)、B2に緑(G=128)、C2に青(B=64)が入っているとします。
| ステップ | 数式 | 結果 |
|---|---|---|
| 赤を16ビット左シフト | BITLSHIFT(255, 16) | 16711680 |
| 緑を8ビット左シフト | BITLSHIFT(128, 8) | 32768 |
| 青はそのまま | 64 | 64 |
| 全部をORで合成 | 上記の合計 | 16744512 |
結果の「16744512」が、HTMLでいう #FF8040 の色コードに相当する10進数です。1セルに1色の情報を保存できるので、配色テーブルがコンパクトになりますね。
パッキングした値を取り出す
逆に、まとめた数値からRGB各値を取り出すには、BITRSHIFTとBITANDを使います。
=BITAND(BITRSHIFT(A2, 16), 255) → 赤の値
=BITAND(BITRSHIFT(A2, 8), 255) → 緑の値
=BITAND(A2, 255) → 青の値
「右シフトで取り出したい位置を一番下に持ってくる → BITAND(255)で下位8ビットだけ残す」というパターンで、各色を分離できますよ。詳しい仕組みはBITAND関数の記事を合わせて確認してみてくださいね。
BITLSHIFTとBITRSHIFTの関係
BITLSHIFT(左シフト)とBITRSHIFT(右シフト)は、シフト方向が逆のペア関数です。第2引数の符号で動きが切り替わります。
| 関数 | 動作 | 値の変化 | 同等の演算 |
|---|---|---|---|
BITLSHIFT(値, n) | 左にnビットシフト | n回ぶん2倍 | 値 × 2^n |
BITRSHIFT(値, n) | 右にnビットシフト | n回ぶん半分 | INT(値 / 2^n) |
実は、BITLSHIFTの第2引数に負の値を渡すと、BITRSHIFTと同じ結果になります。
=BITLSHIFT(40, -3) → 5(40を3ビット右シフト)
=BITRSHIFT(40, 3) → 5(同じ結果)
ただし、可読性のためには「左シフトはBITLSHIFT、右シフトはBITRSHIFT」と分けて書く方がおすすめですよ。読み手が数式の意図をすぐに把握できますね。
BITLSHIFT関数とExcelの互換性
GoogleスプレッドシートのBITLSHIFT関数は、ExcelのBITLSHIFT関数と仕様が同じです。構文・引数・有効範囲・エラー条件のすべてが一致しています。
ExcelファイルをGoogleスプレッドシートで開いた場合でも、BITLSHIFT関数はそのまま動作します。逆にスプレッドシートで作成した数式をExcelで開いても問題ありませんよ。
ExcelのBITLSHIFT関数はExcel 2013以降で利用できます。古いバージョンのExcelファイルを扱うときは、互換性に注意してくださいね。
エラーの種類と対処法
#NUM! エラー
次のいずれかに当てはまると #NUM! エラーになります。
- 第1引数(値)に負の数を指定した
- 第1引数が
(2^48)-1(= 281,474,976,710,655)を超えている - 第1引数に小数を指定した
- 第2引数(シフト量)の絶対値が53を超えている
- シフト結果が
(2^48)-1を超えてしまった
=BITLSHIFT(-1, 2) → #NUM!(負の数は不可)
=BITLSHIFT(2.5, 2) → #NUM!(小数は不可)
=BITLSHIFT(1, 60) → #NUM!(シフト量が大きすぎる)
=BITLSHIFT(2^47, 2) → #NUM!(結果がオーバーフロー)
対処法は、INT関数(小数を切り捨てて整数化する関数)で値を整数化し、シフト量も適切な範囲に収めることです。
=BITLSHIFT(INT(A1), MIN(B1, 47))
シフト量の上限を47程度にしておけば、結果のオーバーフローもまとめて防げますよ。
#VALUE! エラー
引数に文字列を指定すると #VALUE! エラーになります。テキストとして取り込んだ数値をそのまま渡すと発生しがちです。
対処法はVALUE関数(文字列を数値に変換する関数)で数値化することです。
=BITLSHIFT(VALUE(A1), VALUE(B1))
#N/A エラー
引数が不足している場合は #N/A エラーになります。BITLSHIFTは引数2つが必須なので、片方しか渡していないと発生しますよ。
=BITLSHIFT(5) → #N/A(引数不足)
エラー対処:IFERRORで包む
入力データが信頼できない場合は、IFERRORで包んでおくと安心です。
=IFERROR(BITLSHIFT(A2, B2), 0)
エラー時に0を返すようにしておけば、後続の集計が止まらずに済みますよ。
他のビット演算関数との使い分け
スプレッドシートにはBITLSHIFT以外にもビット演算関数が用意されています。場面に応じて使い分けましょう。
| 関数 | 演算 | 説明 | 使いどころ |
|---|---|---|---|
| BITLSHIFT | 左シフト | ビットを左にずらす | 値の2倍・4倍計算、フラグ位置の生成、データパッキング |
| BITRSHIFT | 右シフト | ビットを右にずらす | 値の半分計算、データのアンパック |
| BITAND | AND(論理積) | 両方1のビットだけ残す | 権限チェック・フラグ抽出 |
| BITOR | OR(論理和) | どちらか1のビットを残す | 権限の付与・フラグの合成 |
| BITXOR | XOR(排他的論理和) | 異なるビットだけ残す | フラグの切り替え(トグル)・差分検出 |
BITLSHIFTは「ビットフラグの設計時に位置を作る」「2の累乗計算をしたい」ときに使います。設計したフラグを実際に運用する場面では、BITAND(BITAND関数の記事)でチェック、BITOR(BITOR関数の記事)で合成、BITXOR(BITXOR関数の記事)でトグルという役割分担になりますね。
「設計はBITLSHIFT、運用はAND/OR/XOR」という流れを覚えておくと、業務でビット演算を使うときの全体像が見えやすくなりますよ。
まとめ
GoogleスプレッドシートのBITLSHIFT関数は、指定した数値のビットを左方向にずらす関数です。2の累乗計算やビットフラグの位置生成、複数値のパッキングなど、ビット演算の「設計」面で活躍してくれますよ。
- 構文は
=BITLSHIFT(値, シフト量)、両引数とも必須 - 「左に1桁シフト = 2倍」のルールで値が増えていく
BITLSHIFT(1, n)で「nビット目に1を立てた値」を直接生成できる- ARRAYFORMULAと組み合わせて2の累乗の一覧を一発で作れる
- BITORと組み合わせて権限値の合成を自動化できる
- RGB値や複数情報のパッキング・アンパックに活用できる
- ExcelのBITLSHIFT関数と完全互換(Excel 2013以降)
ビット演算は最初こそ難しく見えますが、BITLSHIFT関数を使えば権限フラグの設計や2の累乗計算がシンプルな数式で書けるようになります。まずは「BITLSHIFT(1, ビット位置)」のパターンから試してみてくださいね。
