我在Excel工作表中有一些大数字,我想将它们转换为二进制文件,例如 12345678 965321458 -12457896 有人可以帮我怎么做。 感谢。
答案 0 :(得分:45)
如果我们在0
和2^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
负数:回想一下,也可以通过建立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),但是占用了更多空间:
您可以在此处下载excel文件:(抱歉,不知道将文件放在何处) int16 bits to decimal.xlsx
或选择以下步骤(如果您的Excel不是英语,请使用Excel Translator将公式“翻译”为MS Office语言):
=IF(NUMBERVALUE(A4)>=1000,TRUE,FALSE)
在G2-J2中输入字母“ A”,在K2-N2中输入字母“ B”,在O2-R2中输入字母“ C”,在S2-V2中输入字母“ D”
在G3,K3,O3和S3中输入“ 1”; H3,L3,P3和T3中的“ 2”; I3,M3,Q3和U3中的“ 3”; J3,N3,R3和V3中的“ 4”
在G4中,输入:
=MID(INDIRECT(G$2&ROW()),G$3,1)
将公式复制到H4-V4
在X4中,输入:
=IF(G4="1",0,1)
将X4复制到Y4-AM4
在BD3中输入“ 1”
在BC4中,输入:
=IF((AM$4+BD3)=2,1,0)
=IF((AM$4+BD3)=2,0,IF((AM$4+BD3)=1,1,0))
复制BD4和BD4,将其对角线插入15次,向下一行,向下一列(如屏幕截图所示),即,将其插入BB5和BC5,然后插入BA6和BB6,...,AN19和AO19。
在AO20中,输入“ = AO19”;在AP20中,输入“ = AP18”,依此类推,直到BD20(“ = BD4”)-即,如屏幕截图所示,将数字降低为一行
在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))