Десятичное двоичное преобразование для больших чисел в Excel

У меня есть большое количество в листе excel, и я хочу преобразовать их в двоичный, например   12345678   965321458   -12457896   Может ли кто-нибудь помочь мне, как это сделать.   Спасибо.

Ответ 1

Если мы говорим о положительном числе между 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 десятичных цифр, число не будет округлено.

Ответ 2

См. VBA, размещенную здесь

' 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

Ответ 3

Я просто попробовал формулу выше и обнаружил, что Microsoft испортила функцию DEC2BIN по-другому, что позволяет правильной работе формулы с отрицательными числами. Внутри DEC2BIN использует десятибитовый результат; ведущие нули удаляются из текстового результата, если не используется необязательный параметр длины, и в этом случае необходимое количество ведущих нулей остается в строке. Но здесь rub: отрицательное число всегда начинается с одного, поэтому нет начальных нулей, поэтому DEC2BIN всегда будет показывать все десять бит! Таким образом, DEC2BIN (-1,8), который должен показать 11111111 (восемь), вместо этого отобразит 1111111111 (десять единиц).

Чтобы исправить это, используйте ПРАВИЛЬНО, чтобы обрезать каждый восьмибитовый кусок до восьми бит, тупой, как это звучит.

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

(Я читаю VBA, и у него нет такой же проблемы, но не похоже, что он вообще будет обрабатывать негативы.)

Ответ 4

Чтобы упростить чтение форматирования на Taosique отличный ответ, вы также можете разбить его на куски 4 бит с пробелами между ними, хотя формула становится монстром:

=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

Конечно, вы можете просто использовать правую половину, если вас интересуют только 16-битные номера:

=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)

0011 0001 0000 0001

Ответ 5

Кто-то может найти здесь операции двоичного сдвига более понятными и актуальными

=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

Эта функция vba решает проблему двоичного преобразования чисел больше 511, что невозможно сделать с помощью WorksheetFunction.dec2bin.
Код использует преимущества функции 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

Возможно, более простой вариант:

Для только положительных чисел, просто используйте BASE (как в BASE2) для чисел от 0 до 2 ^ 53 в Excel. Вот несколько примеров:

=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 ^ 31 в его случае), чтобы использовать дополнение 2:

=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)

Ответ 8

Здесь другой путь. Это не с одной формулой, но я пробовал и конвертировал до номера 2 099 999 999 999. Мое первое намерение состояло в том, чтобы построить 51-битный счетчик, но почему-то он не работает с числами за пределами того, о котором я упоминал. Загрузить с http://www.excelexperto.com/content/macros-production/contador-binario-de-51-bits/

Надеюсь, это полезно. С наилучшими пожеланиями.

Ответ 9

Хотя я не писал это для отрицательных или десятичных знаков, его относительно легко изменить. Этот VBA будет конвертировать любой супер большой (или не такой большой, если вы хотите, но это не так) десятичное значение до преобразованного двоичного результата, содержащего до 32767 цифр (максимальная длина строки в VBA).

Введите десятичное число в ячейке "A1" в виде строки, результат будет в "B1" в виде строки.

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

Ответ 10

Там может быть простое решение. У меня есть несколько 4,2 миллиарда ячеек, которые на самом деле являются отрицательными двумя дополнениями, и это работает, чтобы получить правильное значение: = СУММ (2 ^ 31- (А1-2 ^ 31))