エクセル関数応用
掛け算(*)を使わない掛け算
足し算(+)を使わない足し算

Excel関数の解説、関数サンプルと高等テクニック
公開日:2025-11-10 最終更新日:2025-11-10

掛け算(*)を使わない掛け算|足し算(+)を使わない足し算


掛け算(*)を使わずに掛け算をする数式を作成してください。
足し算(+)を使わずに足し算をする数式を作成してください。


計算可能な桁数は指定しません。
たぶん、作成する数式によって様々な制限が出てくると思います。

※直接・間接とわず内部的に掛け算や足し算をする関数は使用禁止。
PRODUCT,SUMPRODUCT,POWER,MMULT,SUMIF等々
また、割り算(/)や引き算(-)を使った逆算的なものは、あまり意味がないので考えない事にします。

A1*B1=1/(1/A1/B1)
A1+B1=A1*2-(A1-B1)


つまり、純粋にビット演算するか、掛け算なら足し算するかで数式を作成します。



掛け算(*)を使わない掛け算

=LAMBDA(x,y,REDUCE(0,SEQUENCE(48,1,0),LAMBDA(a,z,a+IF(BITAND(y,2^z),BITLSHIFT(x,z),0))))(A1,B1)
数式の解説
アスタリスク(*)を使わずに掛け算を行うためのものです。
コンピューターが内部で行う、二進数の加算とシフト操作を使って、掛ける数(y)と掛けられる数(x)の積を求めます。
  1. 桁の準備 まず、関数は0から47までの48個の整数を用意します。これは、掛ける数(y)を二進数として見たときの、0桁目から47桁目までの48桁をチェックするための準備です。
  2. 桁ごとの判定 関数は、48回の繰り返し処理を行います。各回で、「掛ける数(y)」の現在チェックしている桁が1であるか0であるかを判断します。これが、BITAND関数とIF関数の役割です。
  3. 値のシフト(桁上げ) もし、チェックした桁が1であれば、「掛けられる数(x)」を、現在チェックしている桁の数だけ左にずらします(シフト)。このシフト操作は、xに2の累乗を掛けることに相当し、通常の筆算で「位を上げる」操作と同じ意味を持ちます。これがBITLSHIFT関数の役割です。
  4. 合計への累積 このシフトされた値(または、桁が0だった場合はゼロ)を、それまでの計算結果の合計に加えます。この累積計算をREDUCE関数が行います。
48回の処理がすべて終わると、最終的な合計が「掛ける数」と「掛けられる数」の正確な積となります。

=LAMBDA(x,y,REDUCE(0,SEQUENCE(y),LAMBDA(z,y,z+x)))(A1,B1)
数式の解説
ビット演算を使う方法とは異なり、足し算の繰り返しによって掛け算をシミュレートしています。
これは、xをy回足すという、掛け算の定義そのものを実行する手法です。
  1. 初期値の設定掛け算の結果となる合計(z)をゼロ(0)からスタートさせます。
  2. 繰り返し回数の設定SEQUENCE(y)の部分で、「掛ける数」(y、B1の値)と同じ回数のリストを生成します。つまり、xをy回足すための準備をします。
  3. 足し算の実行REDUCE関数が、SEQUENCEで生成された回数分だけ繰り返し処理を行います。内部のLAMBDA関数では、累積合計(z)に「掛けられる数」(x、A1の値)を毎回加算していきます。これがz + xの部分です。
  4. 最終結果この処理をすべて終えると、xがy回足されたことになり、最終的な合計がx × yの積となります。
この数式の制約
この数式には、先ほどのビット演算よりも単純ですが、厳しい制約があります。
  1. 掛ける数(y)の制約: SEQUENCE関数は、生成する回数(y)が104万8576を超えると、Excelの行数制限により処理できません。
  2. 掛けられる数(x)の制約: xの値が大きすぎると、足し算を繰り返す過程で途中の合計がExcelの数値精度限界(約9京)を超えてしまい、正確な計算ができなくなります。
  3. 速度の制約: ビット演算と違い、この方法は単純な足し算をy回繰り返すため、yの値が非常に大きい場合(例:10万回以上)は、計算に非常に時間がかかります。


足し算(+)を使わない足し算

=LET(
_add1,A1,_add2,B1,
rtn,REDUCE(HSTACK(_add1,_add2),
           SEQUENCE(5),
           LAMBDA(acc,i,
                  LET(s,INDEX(acc,1),
                      c,INDEX(acc,2),
                      HSTACK(BITXOR(s,c),
                             BITLSHIFT(BITAND(s,c),1)
                      )
                  )
           )
    ),
INDEX(rtn,1))
数式の解説
ビット演算を利用して、足し算の演算子 (+) を使わずに A1 + B1 の和を求める数式です。
これは、コンピューターが内部で二進数の足し算を行う仕組み(全加算器のロジック)を再現したものです。
この数式は、和 (Sum) と繰り上がり (Carry) を分離し、繰り上がりがなくなるまで繰り返し計算することで、最終的な合計を求めます。
  1. 処理の流れ

    ステップ 処理内容 数式の対応箇所
    初期値 加算する二つの数値 A1 と B1 を配列に格納し、処理を開始します。 HSTACK(_add1, _add2)
    繰り上げ判定 繰り上がりがなくなるまで、最大5回、計算を繰り返します。 SEQUENCE(5), REDUCE
    和の計算 繰り上がりを無視した、現在のビットごとの和を計算します。 BITXOR(s, c)
    繰り上がりの計算 次の桁へ持ち越す繰り上がりを計算し、左に1ビットシフト(2倍)します。 BITLSHIFT(BITAND(s, c), 1)
    結果 最後に、繰り上がり処理が完了した和を取り出します。 INDEX(rtn, 1)

  2. 各パーツの役割

    関数名 役割 説明
    BITXOR(s, c) 和 (Sum) の計算 排他的論理和 (XOR) は、二つのビットが異なる場合(例: 1+0)に 1 を返します。
    これは、繰り上がりを無視したビットごとの和に相当します。
    BITAND(s, c) 繰り上がりの判定 論理積 (AND) は、二つのビットが共に 1 の場合(例: 1+1)に 1 を返します。
    これは、繰り上がりが発生する箇所を特定します。
    BITLSHIFT(…, 1) 繰り上がりの伝播 繰り上がりが発生した箇所を、左に1ビットずらします。
    これにより、繰り上がりを次の桁の計算に持ち越します。
    HSTACK / INDEX 状態の保持 HSTACK で [和, 繰り上がり] の2列配列を保持し、REDUCE の acc で次のステップへ渡します。
    最終的に INDEX(rtn, 1) で和の列だけを取り出します。

  3. 計算が停止する条件
    REDUCE 関数は SEQUENCE(5) のため、最大5回繰り返します。
    このロジックでは、繰り上がり c が 0 になると、それ以降の BITXOR(s, c) は s を返し、BITLSHIFT(BITAND(s, c), 1) も 0 を返すため、繰り上がりが 0 になった時点で、それ以上は計算結果が変わらなくなり、正確な和が得られます。

繰り上がりの処理方法:分離と伝播
「和の計算」と「繰り上がりの計算」を完全に分けて、何度も繰り返すことで処理します。
繰り上がりの「分離」
数式は入力された二つの数(AとB)を基に、以下の二つを計算します。
  • 現在の和の候補: 二つの数の桁ごとを見て、繰り上がりを無視した和を求めます。
    例えば、1+0 は 1、1+1 は 0 とします。
  • 繰り上がりの値: 二つの数の両方が 1 である桁(つまり 1+1 の箇所)を特定し、そこから発生する 1 を次の桁にずらした値を求めます。
    この処理で、和の候補と、その和の候補によって生み出された繰り上がりが、完全に別の値として分けられます。

繰り上がりの「伝播と加算」
次に、数式は繰り上がりが完全にゼロになるまで、以下の処理を繰り返します。
  • ステップ 1: 分離された「繰り上がりの値」を、次のステップの足し算において、片方の入力として使用します。
  • ステップ 2: この加算により、さらに新しい繰り上がりが発生するかどうかを調べます。
  • ステップ 3: 新しい繰り上がりが発生しなくなったら、処理を停止します。
この繰り返しにより、最初に発生した繰り上がりが、次の桁へ、また次の桁へと次々に伝わっていく(伝播する)現象をシミュレートします。
最終的に、繰り上がりの値が 0 になったとき、その時点の「和の候補」が、すべての繰り上がりを正しく反映した最終的な答えとなります。


※本記事の作成にあたっては随所で生成AIを活用しています。全て最終的に人間が確認した後に掲載しています。





同じテーマ「エクセル関数応用」の記事

セル参照を戻り値とする関数
REDUCE+VSTACKが遅い理由と解決策
HSTACKは速い?遅い?実際に試してみた結果
条件付きMEDIAN関数を作る|LAMBDA関数で汎用〇〇IFSを実現
複数列の直積(デカルト積、クロスジョイン)
フィボナッチ、トリボナッチ、テトラナッチ数列を1数式で作成
表データから複数条件による複合抽出 (横AND/縦OR)
配列を自在に回転させる数式
掛け算(*)を使わない掛け算|足し算(+)を使わない足し算
2段階の入力規則リスト作成:最新関数対応
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ