エクセルパズル:DEC2BINを使わずに2進数に変換
今日、10進数→2進数変換を2進変換関数のDEC2BINを使わずに1つのセルだけで計算する方法を思いつき、早速書いてみました。
最初に書いた式はコチラです↓
=IF(A1>32768,#NUM!,SUM(IF(MOD(A1,2^ROW(A1:A16))>=2^(ROW(A1:A16)-1),1,0)*10^(ROW(A1:A16)-1)))
セルA1に32768以下の値を入力し
セルB1に上記の式を貼り付けて「Ctrl+Enter」で決定、セルの書式設定→表示形式を数値(桁数0)でOKを押して下さい。
これでA1の2進化された値が表示されるようになると思います。
これは配列数式ってやつを使っています。
DEC2BINで充分だろとも思いますが一応良いとこを探すとしたら、DEC2BINでは512以上の値を入力すると#NUM!とエラーになりますが、これなら32768まで表示可能です。
=IF(A1>32768,#NUM!,SUM(IF(MOD(A1,2^ROW(A1:A16))>=2^(ROW(A1:A16)-1),10^(ROW(A1:A16)-1),0)))
→ 90文字
=IF(A1>32768,#NUM!,SUM(IF(MOD(A1,2^ROW(1:16))>=2^(ROW(1:16)-1),10^(ROW(1:16)-1),0)))
→ 84文字(A1:A16→1:16でマイナス6文字)
=IF(A1>32768,#NUM!,SUM(MOD(INT(A1/2^(ROW(1:16)-1)),2)*10^(ROW(1:16)-1)))
→ 72文字(2番目のif文をMOD関数&INT関数に置き換えでマイナス12文字)
=IF(A1>32768,#NUM!,SUM(MOD(INT(2*A1/2^ROW(1:16)),2)*10^ROW(1:16)/10))
→ 69文字(ROW(1:16)-1→ROW(1:16)でマイナス3文字)
=IF(A1>2^15,0^0,SUM(MOD(INT(2*A1/2^ROW(1:16)),2)*10^ROW(1:16)/10))
→ 66文字(32768→2^15、#NUM!→0^0でマイナス3文字)
=(A1<=2^15)^0*SUM(MOD(INT(2*A1/2^ROW(1:16)),2)*10^ROW(1:16)/10)
→ 63文字(ifを消してマイナス3文字)
とまあこんな感じで現在この63文字が現在思いつく最短式です。
まだ一段くらいイケそうな気がするんで、思いついたらまた追記しときます。
ついでに亜流を。
上記式は配列数式を使っているので、式を入力してから「Ctrl+Shift+Enter」で決定しますが、次の式はそれが不要(つまり普通の式)です。
=(A1<=2^15)^0*SUMPRODUCT(MOD(INT(2*A1/2^ROW(1:16)),2),10^ROW(1:16)/10)
更に書式設定不要版。(文字列を返します)
=TEXT((A1<=2^15)^0*SUMPRODUCT(MOD(INT(2*A1/2^ROW(1:16) ),2),10^ROW(1:16)/10),0)
以上です。よければ使ってみて下さい!
【関連記事】
ファミコンぽいエクセル表示バグ見つけた - Koonies/こりゃいいな!
今まで全然知らなかった、エクセルのセル結合方法 - Koonies/こりゃいいな!
Ctrl+C、Ctrl+Vで超簡単にエクセルのセルの結合を解除する方法 - Koonies/こりゃいいな!
エクセルのツールバーを圧縮して作業効率を上げる方法 - Koonies/こりゃいいな!
「あなたは知ってる?ダブルクリックだけでできるExcelの小技いろいろ」にもう1個 - Koonies/こりゃいいな!