汎用機メモっとくか

しごと用の(学習メモ&お気に入り保存)。

dec2bin 512以上を式を使って 0 ~ 65535と-32768 ~ 32767まで可能にしてみた

2012年05月21日 23時31分58秒 | EXCEL

dec2bin 512以上を式を使って 0 ~ 65535と-32768 ~ 32767まで可能にしてみた。

      0 ~ 65535
=DEC2BIN(QUOTIENT(A3,256),8)&DEC2BIN(MOD(A3,256),8)

     0  0000000000000000
     1  0000000000000001
     2  0000000000000010
     4  0000000000000100
     8  0000000000001000
    16  0000000000010000
    32  0000000000100000
    64  0000000001000000
   128  0000000010000000
   256  0000000100000000
   512  0000001000000000
  1024  0000010000000000
  2048  0000100000000000
  4096  0001000000000000
  8192  0010000000000000
 16384  0100000000000000
 32768  1000000000000000
 65535  1111111111111111

 -32768 ~ 32767
 範囲超過時のエラー出力無し
 =IF(A22>=0,"0"&DEC2BIN(QUOTIENT(A22,256),7)&DEC2BIN(MOD(A22,256),8),
            "1"&DEC2BIN(QUOTIENT(32768+A22,256),7)&DEC2BIN(MOD(32768+A22,256),8))

多分合ってると思う        |----ここは、↑上の関数式を
                          ↓    BIN2HEX("?"&DEC2BIN),2)としただけ
    -1  1111111111111111  FFFF
    -2  1111111111111110  FFFE
    -3  1111111111111101  FFFD
    -4  1111111111111100  FFFC
    -5  1111111111111011  FFFB
    -6  1111111111111010  FFFA
    -7  1111111111111001  FFF9
    -8  1111111111111000  FFF8
    -9  1111111111110111  FFF7
   -15  1111111111110001  FFF1
   -16  1111111111110000  FFF0
   -17  1111111111101111  FFEF
   -31  1111111111100001  FFE1
   -32  1111111111100000  FFE0
   -33  1111111111011111  FFDF
   -63  1111111111000001  FFC1
   -64  1111111111000000  FFC0
   -65  1111111110111111  FFBF
  -127  1111111110000001  FF81
  -128  1111111110000000  FF80
  -129  1111111101111111  FF7F
  -255  1111111100000001  FF01
  -256  1111111100000000  FF00
  -257  1111111011111111  FEFF
  -511  1111111000000001  FE01
  -512  1111111000000000  FE00
  -513  1111110111111111  FDFF
 -1023  1111110000000001  FC01
 -1024  1111110000000000  FC00
 -1025  1111101111111111  FBFF
 -2047  1111100000000001  F801
 -2048  1111100000000000  F800
 -2049  1111011111111111  F7FF
 -4095  1111000000000001  F001
 -4096  1111000000000000  F000
 -4097  1110111111111111  EFFF
 -8191  1110000000000001  E001
 -8192  1110000000000000  E000
 -8193  1101111111111111  DFFF
-16383  1100000000000001  C001
-16384  1100000000000000  C000
-16385  1011111111111111  BFFF
-32767  1000000000000001  8001
-32768  1000000000000000  8000
     0  0000000000000000  0000
     1  0000000000000001  0001
     2  0000000000000010  0002
     4  0000000000000100  0004
     8  0000000000001000  0008
    16  0000000000010000  0010
    32  0000000000100000  0020
    64  0000000001000000  0040
   128  0000000010000000  0080
   256  0000000100000000  0100
   512  0000001000000000  0200
  1024  0000010000000000  0400
  2048  0000100000000000  0800
  4096  0001000000000000  1000
  8192  0010000000000000  2000
 16384  0100000000000000  4000
 32767  0111111111111111  7FFF

<20160817追記sta>HEX部分。使う機会が訪れるとは、思わなかった。どうすればいいのか忘れてた。
=IF(A22>=0,BIN2HEX("0"&DEC2BIN(QUOTIENT(A22,256),7),2)&BIN2HEX(DEC2BIN(MOD(A22,256),8),2),
           BIN2HEX("1"&DEC2BIN(QUOTIENT(32768+A22,256),7),2)&BIN2HEX(DEC2BIN(MOD(32768+A22,256),8),2))
<20160817追記end>

 

<20160921追記sta>
16bit用 BIN2DEC 負符号用
=IF(LEFT(F7,1)="1",(32768-(MID(F7,2,1)*12684
                          +MID(F7,3,1)*8192
                          +MID(F7,4,1)*4096
                          +MID(F7,5,1)*2048
                          +MID(F7,6,1)*1024
                          +MID(F7,7,1)*512
                          +MID(F7,8,1)*256
                          +MID(F7,9,1)*128
                          +MID(F7,10,1)*64
                          +MID(F7,11,1)*32
                          +MID(F7,12,1)*16
                          +MID(F7,13,1)*8
                          +MID(F7,14,1)*4
                          +MID(F7,15,1)*2
                          +MID(F7,16,1)*1))*-1,BIN2DEC(LEFT(F7,8))*256+BIN2DEC(RIGHT(F7,8)))

さらに

=IF(LEFT(F7,1)="1",(32768-(BIN2DEC("0"&MID(F7,2,7))*256+BIN2DEC(MID(F7,9,8))))*-1,BIN2DEC(MID(F7,1,8))*256+BIN2DEC(MID(F7,9,8)))

もうちょこっと

=IF(LEFT(F7,1)="1",-32768+(BIN2DEC(MID(F7,2,7))*256+BIN2DEC(MID(F7,9,8))),BIN2DEC(MID(F7,1,8))*256+BIN2DEC(MID(F7,9,8)))

8bit用 BIN2DEC 負符号用
=IF(LEFT(F71,1)="1",(128-(MID(F71,2,1)*64
                          +MID(F71,3,1)*32
                          +MID(F71,4,1)*16
                          +MID(F71,5,1)*8
                          +MID(F71,6,1)*4
                          +MID(F71,7,1)*2
                          +MID(F71,8,1)*1))*-1,BIN2DEC(F71))

=IF(LEFT(F7,1)="1",-128+BIN2DEC(MID(F7,2,7)),BIN2DEC(F7))

HEX2DECは、別セルにHEX2BINして、上記をかければいくはず。

<20160921追記end>

 

<20160926追記sta>

 calc.exe電卓 にsendkeysでDEC2HEX DEC2BINをやらせる
http://blog.goo.ne.jp/tkhs1732/e/d96c80aff91c02c26784c4533cfea718

<20160926追記end>

<20171217追記sta>

後はMIDとHEX2BINでなんとかなるじゃないかっぁぁ~!!しらんかった。

Excel2007

Google

Libre

 

 

逆がむずかしいとおもわれます。

E27とE30

=HEX2BIN(MID(DEC2HEX(B30,10),1,2),8)&HEX2BIN(MID(DEC2HEX(B30,10),3,2),8)&HEX2BIN(MID(DEC2HEX(B30,10),5,2),8)&HEX2BIN(MID(DEC2HEX(B30,10),7,2),8)&HEX2BIN(MID(DEC2HEX(B30,10),9,2),8)

F25とF29 文字列にしてます。今思い浮かぶのは、こんなとこ。

=IF(LEFT(E29,1)="1","-"&TEXT(2^39-(BIN2DEC("0"&MID(E29,2,7))*2^32+BIN2DEC(MID(E29,9,8))*2^24+BIN2DEC(MID(E29,17,8))*2^16+BIN2DEC(MID(E29,25,8))*2^8+BIN2DEC(MID(E29,33,8))),"0"),TEXT(BIN2DEC("0"&MID(E29,2,7))*2^32+BIN2DEC(MID(E29,9,8))*2^24+BIN2DEC(MID(E29,17,8))*2^16+BIN2DEC(MID(E29,25,8))*2^8+BIN2DEC(MID(E29,33,8)),"0"))

32bit整形は、また後日。

64bitだとVBAでDecimal使ってやるしかないすね

これも、また後日。

 

下記は、単にDecimal型で計算できるかのサンプルです。

Sub aaa()
    Dim x01 As Variant
    Dim x02 As Variant
    x01 = CDec(2 ^ 64)
    MsgBox x01
    Sheets("Sheet2").Range("A1").Value = "'" & x01
   
    x02 = Int(CDec((2 ^ 64 - 1) / (2 ^ 32)))
    MsgBox x02
    Sheets("Sheet2").Range("A2").Value = "'" & x02
   
    x03 = CDec(2 ^ 64 - 1) - Int(CDec((2 ^ 32) * x02))
    MsgBox x03
    Sheets("Sheet2").Range("A3").Value = "'" & x03

 

End Sub

 

<20171217追記end>

 <20171221追記sta>

 Sub aaa02()
    Dim x01 As Variant
    Dim x02 As Variant
    Dim const_2_64 As Variant
    Dim const_2_64_1 As Variant
    Dim const_2_50 As Variant
   
    const_2_64 = CDec(2 ^ 32) * CDec(2 ^ 32)
    MsgBox const_2_64
    Sheets("Sheet2").Range("B1").Value = "2^64    ="
    Sheets("Sheet2").Range("C1").Value = "'" & const_2_64
   
    const_2_64_1 = CDec(2 ^ 32) * CDec(2 ^ 32) - 1
    MsgBox const_2_64_1
    Sheets("Sheet2").Range("B2").Value = "2^64 - 1="
    Sheets("Sheet2").Range("C2").Value = "'" & const_2_64_1
   
    x02 = Int(CDec(const_2_64_1 / (2 ^ 32)))
    MsgBox x02
    Sheets("Sheet2").Range("B3").Value = "(2^64 - 1) \   2^32="
    Sheets("Sheet2").Range("C3").Value = "'" & x02
    Sheets("Sheet2").Range("D3").Formula = "=Dec2HEX(C3,10)"
   
    x03 = CDec(const_2_64_1 - CDec((2 ^ 32) * x02))
    MsgBox x03
    Sheets("Sheet2").Range("B4").Value = "(2^64 - 1) Mod 2^32="
    Sheets("Sheet2").Range("C4").Value = "'" & x03
    Sheets("Sheet2").Range("D4").Formula = "=Dec2HEX(C4,10)"

     '************************************************
    const_2_50 = CDec(2 ^ 32) * CDec(2 ^ 18)
    MsgBox const_2_50
    Sheets("Sheet2").Range("B6").Value = "2^50     ="
    Sheets("Sheet2").Range("C6").Value = "'" & const_2_50
    
    const_2_50 = CDec(2 ^ 32) * CDec(2 ^ 18) + 123
    MsgBox const_2_50
    Sheets("Sheet2").Range("B7").Value = "2^50+123 ="
    Sheets("Sheet2").Range("C7").Value = "'" & const_2_50
   
    x02 = Int(CDec(const_2_50 / (2 ^ 32)))
    MsgBox x02
    Sheets("Sheet2").Range("B8").Value = "(2^50+123) \   2^32="
    Sheets("Sheet2").Range("C8").Value = "'" & x02
    Sheets("Sheet2").Range("D8").Formula = "=Dec2HEX(C8,10)"
   
    x03 = CDec(const_2_50 - CDec((2 ^ 32) * x02))
    MsgBox x03
    Sheets("Sheet2").Range("B9").Value = "(2^50+123) Mod 2^32="
    Sheets("Sheet2").Range("C9").Value = "'" & x03
    Sheets("Sheet2").Range("D9").Formula = "=Dec2HEX(C9,10)"

 End Sub

 

VBAでの精度は、2^49まで、2^50からくるいます

<20171221追記end>

<20171224追記sta>MS Office2007にBASE関数はありません。2013からあるらしい。

Libreは64使わなければ大丈夫かと

下記Google

下記Libre

<20171224追記end>

<20171225追記sta>

とりあえず10桁の符号付き

DEC2BINとBIN2DEC -2147483648~2147483647まで


C5 =DEC2HEX(B5,10)

D5 =HEX2BIN(MID(C5,3,2),8)&HEX2BIN(MID(C5,5,2),8)&
HEX2BIN(MID(C5,7,2),8)&HEX2BIN(MID(C5,9,2),8)

E5 =BIN2HEX(MID(D5,1,8),2)&BIN2HEX(MID(D5,9,8),2)&
BIN2HEX(MID(D5,17,8),2)&BIN2HEX(MID(D5,25,8),2)

F5 =HEX2DEC("FF"&E5)

F6 =HEX2DEC(E6)

G7 =IF(LEN(D5)=32,IF(LEFT(D5,1)="1",HEX2DEC("FF"&E5),HEX2DEC("E5")),"Please32digits")

D8 DEC2BIN 

=HEX2BIN(MID(DEC2HEX(B8,10),3,2),8)&HEX2BIN(MID(DEC2HEX(B8,10),5,2),8)&HEX2BIN(MID(DEC2HEX(B8,10),7,2),8)&HEX2BIN(MID(DEC2HEX(B8,10),9,2),8)

範囲チェックいれておいたほうが無難でしょう。

=IF(AND(B8>=-2147483648,B8<=2147483647,B8<>""),"関数を入れてください","範囲外です")

G8 BIN2DEC =IF(LEN(D8)=32,IF(LEFT(D8,1)="1",HEX2DEC("FF"&BIN2HEX(MID(D8,1,8),2)&BIN2HEX(MID(D8,9,8),2)&BIN2HEX(MID(D8,17,8),2)&BIN2HEX(MID(D8,25,8),2)),HEX2DEC(BIN2HEX(MID(D8,1,8),2)&BIN2HEX(MID(D8,9,8),2)&BIN2HEX(MID(D8,17,8),2)&BIN2HEX(MID(D8,25,8),2))),"Please32digits")

<20171225追記end>

コメント (1)