10進数を2進数に変換するDEC2BIN()関数の上限

使用する関数:DEC2BIN、IF、TEXT、MOD、VALUE
・関数DEC2BIN(decimal to binary)
・書式=DEC2BIN(10進数の数値)
・内容DEC2BIN 関数を使用して10進数を2進数に変換します。
使用例
=DEC2BIN(31)
=11111

=DEC2BIN(21)
=10101

10進数を2進数に変換するDEC2BIN()関数は上限がります
=DEC2BIN(511)
=111111111(←1が9個

DEC2BIN(512)以上だと#NUM!エラーになります

2進数から10進数のように512以上を数式にしてみます

エクセルでは15桁以上は値が丸められてしまうので
限界の15桁まで考えます

表示文字数の限界は2進数の
111111111111111(←1が15個になります
これは10進数の32767です

通常に10進数を2進数にする方法は数式でもありますが
ここはエクセルですから
数式にとらわれず数学ではできない柔軟な発想で解きます

流れ
32768以上はエラーにします

511以下はDEC2BIN関数を使います

10桁から15桁を各桁1か0かを判定して&でつなげます

0と1の15桁をVALUE関数で数値化します

完成

では最初に元の数字
セルH2)に「32767」10進数を入れます



結果が11桁を超えると1.11111E+11と短縮されるので
111111111111111と表示させるには
セルの書式設定を数式にしておく必要があります

まず10進数が32767以下で32768以上でエラーにします
=IF(J2>32767,"32768以上は計算できません","")

511以下はDEC2BIN関数を使います
=IF(J2<512,DEC2BIN(J2),"0")

先頭の「0」が消えてしまうのでTEXT関数で強制的に9文字表示
=TEXT(DEC2BIN(J2),"000000000")

全体を512で割った余りが511以下の数字になるのでMOD関数で余りを取得
=MOD(J2,512)

上記を組み合わせて、下9桁の2進数は
=TEXT(IF(J2<512,DEC2BIN(J2),DEC2BIN(MOD(J2,512))),"000000000")


2進数111111111111111
各桁1かを判定

=IF(J2>=16384,"1","0")←15桁目
=IF(MOD(J2,16384)>=8192,"1","0")←14桁目
=IF(MOD(J2,8192)>=4096,"1","0")←13桁目
=IF(MOD(J2,4096)>=2048,"1","0")←12桁目
=IF(MOD(J2,2048)>=1024,"1","0")←11桁目
=IF(MOD(J2,1024)>=512,"1","0")←10桁目
9桁以下は
=TEXT(IF(J2<512,DEC2BIN(J2),DEC2BIN(MOD(J2,512))),"000000000")

これを全部「&」でくっつけると文字列になってしまうので
全部をVALUE()でくくって数値にして
最初の32768以上のエラーメッセージを組み込みます
=IF(J2>32767,"32768以上は計算できません",VALUE())


287文字です。BIN2DECの15桁よりはかなり短いです。


上記のエラーメッセージは
=IF(J2>32767,"32768以上は計算できません",VALUE())

32768以上で「32768以上は計算できません」と結果として表示しますが
入力規則で32768以上で警告がでて入力できないようにすることができます



データタブの中の「データの入力規則」を選択します



設定タブの「入力値の種類」の整数を選択します



データを「次の値の間」
最小値「0」
最大値「32767」にします



32768以上の数値を入力すると
ポップアップでエラーメッセージが表示されます

このポップアップメッセージは変更することができます



「データの入力規則」で「エラーメッセージ」タブを選択

タイトルに「32768以上は計算できません」

エラーメッセージに
「2進数が16桁以上は計算できません。0~32767の整数を入力してください」
と入力します



ポップアップのエラーメッセージが変更されます

以上 10進数を2進数に変換でした



ここから下は暇つぶし程度にご覧ください

おまけ
実は上記の方法は最終的に2進数を数値として扱っているので
エクセルの限界である15桁にしていますが
2進数を数値ではなく文字として表示するだけなら
10進数の15桁の限界である999999999999999まで
2進数は全部1の場合
1111111111111111111111111111111111111111111111111
49桁まで取得できます

最大値は
10進数15桁の
999999999999999
2進数は50桁で

11100011010111111010100100110001100111111111111111
になります

上記と同じ方法で1桁ずつ「0」か「1」を判定します
14桁までは上記で出ています

=IF(MOD(J2,1024)>=512,"1","0")←10桁目
=IF(MOD(J2,2048)>=1024,"1","0")←11桁目
=IF(MOD(J2,4096)>=2048,"1","0")←12桁目
=IF(MOD(J2,8192)>=4096,"1","0")←13桁目
=IF(MOD(J2,16384)>=8192,"1","0")←14桁目
=IF(MOD(J2,32768)>=16384,"1","0")←15桁目
=IF(MOD(J2,65536)>=32768,"1","0")←16桁目
=IF(MOD(J2,131072)>=65536,"1","0")←17桁目
=IF(MOD(J2,262144)>=131072,"1","0")←18桁目
=IF(MOD(J2,524288)>=262144,"1","0")←19桁目
=IF(MOD(J2,1048576)>=524288,"1","0")←20桁目
=IF(MOD(J2,2097152)>=1048576,"1","0")←21桁目
=IF(MOD(J2,4194304)>=2097152,"1","0")←22桁目
=IF(MOD(J2,8388608)>=4194304,"1","0")←23桁目
=IF(MOD(J2,16777216)>=8388608,"1","0")←24桁目
=IF(MOD(J2,33554432)>=16777216,"1","0")←25桁目
=IF(MOD(J2,67108864)>=33554432,"1","0")←26桁目
=IF(MOD(J2,134217728)>=67108864,"1","0")←27桁目
=IF(MOD(J2,268435456)>=134217728,"1","0")←28桁目
=IF(MOD(J2,536870912)>=268435456,"1","0")←29桁目

倍々と増える数値が次は「"1073741824"」になります
「"1073741824"」←12文字を超えるので文字数を少なくするため
「POWER(2,30)」←11文字のPOWER関数を使います

=IF(MOD(J2,POWER(2,30))>=536870912,"1","0")←30桁目
=IF(MOD(J2,POWER(2,31))>=POWER(2,30),"1","0")←31桁目
=IF(MOD(J2,POWER(2,32))>=POWER(2,31),"1","0")←32桁目
=IF(MOD(J2,POWER(2,33))>=POWER(2,32),"1","0")←33桁目
=IF(MOD(J2,POWER(2,34))>=POWER(2,33),"1","0")←34桁目
=IF(MOD(J2,POWER(2,35))>=POWER(2,34),"1","0")←35桁目
=IF(MOD(J2,POWER(2,36))>=POWER(2,35),"1","0")←36桁目
=IF(MOD(J2,POWER(2,37))>=POWER(2,36),"1","0")←37桁目
=IF(MOD(J2,POWER(2,38))>=POWER(2,37),"1","0")←38桁目
=IF(MOD(J2,POWER(2,39))>=POWER(2,38),"1","0")←39桁目
=IF(MOD(J2,POWER(2,40))>=POWER(2,39),"1","0")←40桁目
=IF(MOD(J2,POWER(2,41))>=POWER(2,40),"1","0")←41桁目
=IF(MOD(J2,POWER(2,42))>=POWER(2,41),"1","0")←42桁目
=IF(MOD(J2,POWER(2,43))>=POWER(2,42),"1","0")←43桁目
=IF(MOD(J2,POWER(2,44))>=POWER(2,43),"1","0")←44桁目
=IF(MOD(J2,POWER(2,45))>=POWER(2,44),"1","0")←45桁目
=IF(MOD(J2,POWER(2,46))>=POWER(2,45),"1","0")←46桁目
=IF(MOD(J2,POWER(2,47))>=POWER(2,46),"1","0")←47桁目
=IF(MOD(J2,POWER(2,48))>=POWER(2,47),"1","0")←48桁目
=IF(MOD(J2,POWER(2,49))>=POWER(2,48),"1","0")←49桁目
=IF(MOD(J2,POWER(2,50))>=POWER(2,49),"1","0")←50桁目
全部&でつなぎます


1715文字です(・・・・・・・)

なぜでしょうある数字を超えるとエラーになります
ある数字とは
576460799999999
この数字を超えると#NUM!エラーになります

どうやらMOD関数の限界らしい
=MOD(576460799999999,512)までは511と出ますが
=MOD(576460800000000,512)とすると#NUM!エラーになります
MOD関数の限界のようです

したがって上記の数式では
10進数15桁
576460799999999
2進数50桁
10000011000100100110111101001101011111111111111111
が限界です

576460799999999を超えると#NUM!エラーになります

ちなみにMOD関数は余りを出す関数なので
普通に計算して余りを出すこともできます

=MOD(1000,300) 結果→100
同じ式は
=1000-(INT(1000/300)*300) 結果→100

上記の数式に当てはめると
MOD(J2,1024)

J2-(INT(J2/1024)*1024)
なので
=IF(MOD(J2,1024)>=512,"1","0")

=IF(J2-(INT(J2/1024)*1024)>=512,"1","0")
となります

ちらっと試しましたがもっと若い数字でエラーになりました
MOD関数の限界というか内部での計算の限界のようです

また時間があるとき更新したいと思います

以上 10進数を2進数に変換する 暇人でした

2進数から10進数は999999999999999まで行けました
2進数を10進数に変換


他のN進数変換は
BIN2DEC 2進数(BIN)から10進数(DEC)
BIN2HEX 2進数(BIN)から16進数(HEX)
DEC2BIN 10進数(DEC)から2進数(BIN)
DEC2OCT 10進数(DEC)から 8進数(OCT)

2進数(BIN)8進数(OCT)10進数(DEC)16進数(HEX)として
おそらく
BIN to OCT で BIN2DEC 2進数から8進数だと思われます

2進数(BIN)はバイナリ (binary) の bin
8進数(OCT)はオクタル (octal) の oct
10進数(DEC)はデシマル (decimal) の dec
16進数(HEX)はヘキサデシマル (hexadecimal) の hex

10進数(DEC)を16進数(HEX)にしたい場合
DEC to HEX なので関数は DEC2HEXになります
=DEC2HEX(100) =64
=DEC2HEX("255") =FF

TOPIF関数の使用回数の上限
(C) 2024 Digital World