Excel中的大数字的十进制到二进制转换

时间:2014-06-24 13:27:13

标签: excel excel-vba vba

我在Excel工作表中有一些大数字,我想将它们转换为二进制文件,例如     12345678     965321458     -12457896     有人可以帮我怎么做。     感谢。

12 个答案:

答案 0 :(得分:45)

如果我们在02^32-1之间谈论正数,您可以使用以下公式:

=DEC2BIN(MOD(QUOTIENT($A$1,256^3),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^2),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^1),256),8)&DEC2BIN(MOD(QUOTIENT($A$1,256^0),256),8)

注意: =DEC2BIN()函数无法处理大于511的数字,因此您看到我的公式将您的数字分成四个8位块,将它们转换为二进制格式然后连接结果

好吧,理论上你可以将这个公式扩展到六个8位块。在Excel中可以获得的最大精度是15(十五)个十进制数字。超过时,仅保留最重要的15位数,其余为四舍五入。即如果您键入12345678901234567,Excel会将其存储为12345678901234500。因此,由于2^48-1长度为15位十进制数,因此该数字不会被舍入。

答案 1 :(得分:6)

请参阅VBA发布的here

' The DecimalIn argument is limited to 79228162514264337593543950245
' (approximately 96-bits) - large numerical values must be entered
' as a String value to prevent conversion to scientific notation. Then
' optional NumberOfBits allows you to zero-fill the front of smaller
' values in order to return values up to a desired bit level.
Function DecToBin(ByVal DecimalIn As Variant, Optional NumberOfBits As Variant) As String
  DecToBin = ""
  DecimalIn = CDec(DecimalIn)
  Do While DecimalIn <> 0
    DecToBin = Trim$(Str$(DecimalIn - 2 * Int(DecimalIn / 2))) & DecToBin
    DecimalIn = Int(DecimalIn / 2)
  Loop
  If Not IsMissing(NumberOfBits) Then
    If Len(DecToBin) > NumberOfBits Then
      DecToBin = "Error - Number too large for bit size"
    Else
      DecToBin = Right$(String$(NumberOfBits, "0") & _
      DecToBin, NumberOfBits)
    End If
  End If
End Function

答案 2 :(得分:5)

我刚尝试了上面的公式,发现微软以另一种方式搞砸了DEC2BIN功能,使公式无法正确处理负数。在内部,DEC2BIN使用十位结果;除非使用可选的长度参数,否则从文本结果中删除前导零,在这种情况下,字符串中将保留所需的前导零数。但这就是问题:负数总是从一个开始,所以没有前导零下降,所以DEC2BIN将始终显示所有十位!因此,应显示11111111(8个)的DEC2BIN(-1,8)将显示1111111111(10个)。

要解决此问题,请使用RIGHT将每个8位块修剪为8位,听起来很愚蠢。

=RIGHT(DEC2BIN(QUOTIENT(A1,256^3),8),8) & RIGHT(...

(我通过VBA阅读,它没有同样的问题,但看起来它根本不会处理负片。)

答案 3 :(得分:2)

为了给Taosique的优秀答案添加更容易阅读的格式,您还可以将其分解为4位的块,中间有空格,尽管公式增长为怪物:

text

当然,如果您只对16位数字感兴趣,可以使用它的右半部分:

=DEC2BIN(MOD(QUOTIENT($A$1,16^7),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^6),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^5),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^4),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^3),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^2),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^1),16),4)&" "&DEC2BIN(MOD(QUOTIENT($A$1,16^0),16),4)

1101 0100 1111 0110 0011 0001 0000 0001

答案 4 :(得分:2)

也许是一个更简单的选项:

仅对于正数,对于Excel中0到2 ^ 53之间的数字,只需使用BASE(如BASE2)即可。以下是一些示例:

=BASE(3,2)  # returns 11

=BASE(11,2)  # returns 1011

答案的信用在这里: https://ask.libreoffice.org/en/question/69797/why-is-dec2bin-limited-to-82bits-in-an-32-and-64-bits-world/

负数:回想一下,也可以通过建立howy61的答案来处理负数。他使用2的补码将所有内容乘以2的幂(在本例中为2 ^ 31):

=BASE(2^31+MyNum, 2)

如此(仅将2 ^ 8用作8位):

=BASE(2^8+(-1),2)  # returns 11111111 

=BASE(2^8+(-3),2)  # returns 11111101

OP给出的数字需要更多位,所以我将使用2 ^ 31(可能会增加到2 ^ 53):

=BASE(2^31+(-12457896),2)  # returns 11111111010000011110100001011000

对于正数或负数,两个公式都可以在单个IF公式中耦合。您可以通过以下两种方式给出相同的答案,其中MyNum是您以十进制数字开头的数字:

=IF(MyNum<0, BASE(2^31+MyNum,2), BASE(MyNum, 2))

=BASE(IF(MyNum<0, MyNum+2^32, MyNum), 2)

答案 5 :(得分:1)

有人可以在这里找到更清晰和相关的二进制移位操作

=DEC2BIN(BITRSHIFT($A$1,24),8) & DEC2BIN(MOD(BITRSHIFT($A$1,16),256),8) & DEC2BIN(MOD(BITRSHIFT($A$1,8),256),8) & DEC2BIN(MOD($A$1,256),8)

此公式适用于32位值

答案 6 :(得分:1)

此vba函数解决了用WorksheetFunction.dec2bin无法完成的大于511的数字的二进制转换的问题。
该代码通过分段应用来利用WorksheetFunction.dec2bin函数。

Function decimal2binary(ByVal decimal2convert As Long) As String
Dim rest As Long
If decimal2convert = 0 Then
   decimal2binary = "0"
   Exit Function
End If
Do While decimal2convert > 0
   rest = decimal2convert Mod 512
   decimal2binary = Right("000000000" + WorksheetFunction.Dec2Bin(rest), 9) + decimal2binary
   decimal2convert = (decimal2convert - rest) / 512
Loop
decimal2binary = Abs(decimal2binary)
End Function

答案 7 :(得分:0)

这是另一种方式。这不是单一的公式,但我已经尝试并转换为数字2,099,999,999,999。我的第一个目的是建立一个51位计数器,但不知何故,它不适用于我提到的数字之外的数字。从下载 http://www.excelexperto.com/content/macros-production/contador-binario-de-51-bits/

我希望它有用。问候。

答案 8 :(得分:0)

虽然我没有为负数或小数写这个,但它应该相对容易修改。这个VBA将转换任何超大(或者不是那么大,如果你想要,但这不是重点)十进制到转换后的二进制结果,最多包含32767个数字(VBA中的最大字符串长度)。

在单元格中输入十进制&#34; A1&#34;作为一个字符串,结果将在&#34; B1&#34;作为一个字符串。

Dim NBN As String

Dim Bin As String

5 Big = Range("A1")

AA = Len(Big)

For XX = 1 To AA

L1 = Mid(Big, XX, 1) + CRY

CRY = 0

If L1 = 0 Then

FN = "0"

GoTo 10

End If

If Int(L1 / 2) = L1 / 2 Then

FN = L1 / 2

GoTo 10

End If

If Int(L1 / 2) <> L1 / 2 Then

FN = Int(L1 / 2)

CRY = 10

GoTo 10

End If

10 NBN = NBN & FN

Next XX

If Left(NBN, 1) = "0" Then

NBN = Right(NBN, (Len(NBN) - 1))

End If

If CRY = 10 Then Bin = "1" & Bin Else Bin = "0" & Bin

Range("A1") = NBN

Range("A2") = Bin

If Len(NBN) > 0 Then

NBN = ""

CRY = 0

GoTo 5

End If

答案 9 :(得分:0)

=IF(Decimal>-1,BASE(Decimal,2,32),BASE(2^32+(Decimal),2))

同时使用正数和负数。 大声笑了一点。双关语。 不客气。

答案 10 :(得分:0)

没有VBA,也使用负数(此处为sint16),但是占用了更多空间:

Screenshot of the "int16 bits to decimal.xlsx" excel sheet

您可以在此处下载excel文件:(抱歉,不知道将文件放在何处) int16 bits to decimal.xlsx

或选择以下步骤(如果您的Excel不是英语,请使用Excel Translator将公式“翻译”为MS Office语言):

  1. 如屏幕截图所示,以4位半字节输入二进制数(A4 =最高有效到D4 =最低有效)。输入所有4位数字(即使以0开头),并将其格式设置为“文本”
  2. 在F4中输入公式:
    =IF(NUMBERVALUE(A4)>=1000,TRUE,FALSE)
  1. 在G2-J2中输入字母“ A”,在K2-N2中输入字母“ B”,在O2-R2中输入字母“ C”,在S2-V2中输入字母“ D”

  2. 在G3,K3,O3和S3中输入“ 1”; H3,L3,P3和T3中的“ 2”; I3,M3,Q3和U3中的“ 3”; J3,N3,R3和V3中的“ 4”

  3. 在G4中,输入:

    =MID(INDIRECT(G$2&ROW()),G$3,1)
  1. 将公式复制到H4-V4

  2. 在X4中,输入:

    =IF(G4="1",0,1)
  1. 将X4复制到Y4-AM4

  2. 在BD3中输入“ 1”

  3. 在BC4中,输入:

    =IF((AM$4+BD3)=2,1,0)
  1. 在BD4中,输入:
    =IF((AM$4+BD3)=2,0,IF((AM$4+BD3)=1,1,0))
  1. 复制BD4和BD4,将其对角线插入15次,向下一行,向下一列(如屏幕截图所示),即,将其插入BB5和BC5,然后插入BA6和BB6,...,AN19和AO19。

  2. 在AO20中,输入“ = AO19”;在AP20中,输入“ = AP18”,依此类推,直到BD20(“ = BD4”)-即,如屏幕截图所示,将数字降低为一行

  3. 在BE20中输入(这是您的结果):

    =IF(F4=FALSE,BIN2DEC(A4&B4)*2^8+BIN2DEC(C4&D4),-1*(BIN2DEC(AO20&AP20&AQ20&AR20&AS20&AT20&AU20&AV20)*2^8+BIN2DEC(AW20&AX20&AY20&AZ20&BA20&BB20&BC20&BD20)))

答案 11 :(得分:-2)

可能有一个简单的解决方案。我有几个42亿个单元格实际上是负二的补充,这可以得到正确的值: = SUM(2 ^ 31-(A1-2 ^ 31))