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

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活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)


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

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




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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