15

В Excel мне нужно создать таблицу со всеми комбинациями 1 и 0 для 12 пробелов.

1 1 1 1 1 1 1 1 1 1 1 1

0 1 1 1 1 1 1 1 1 1 1 1

0 0 1 1 1 1 1 1 1 1 1 1

0 0 0 1 1 1 1 1 1 1 1 1

и так далее и тому подобное, получая все комбинации, такие как

0 1 0 1 0 1 0 1 0 1 0 1

Как я могу это сделать?

7 ответов7

27

Поскольку 2 ^ 12 = 4096, вам нужно 4096 ячеек (12 для ваших 12 бит).

В принципе, вы вводите в A1 до A4096 эту команду:

=Right("00000000000" & Dec2Bin(Row()-1),12)

Это было бы так, но это работает только для 0 ... 511 (9 бит). Таким образом, мы применяем хитрость: мы разбиваем число на 3-битную и 9-битную части и вычисляем две строки отдельно, а затем объединяем их.

Следовательно, у вас есть:

=RIGHT("00" & DEC2BIN((ROW()-1)/512),3) & RIGHT("00000000" & DEC2BIN(MOD((ROW()-1),512)),9)

Изменить: я не знал о необязательном аргументе числа цифр. Используя это даст эту функцию:

=DEC2BIN((ROW()-1)/512,3) & DEC2BIN(MOD((ROW()-1),512),9)

Поместите это в ячейки A1 до A4096.

Редактировать 2: В соответствии с комментарием Лю Vĩnh Phúc, возможно, что ОП хотел 12 столбцов с одной двоичной цифрой в каждом. В этом случае положить

=MID( DEC2BIN((ROW()-1)/512,3) & DEC2BIN(MOD((ROW()-1),512),9) ,COL(),1)

во все клетки от А1 до L 4096.

22

Просто скопируйте и вставьте следующую формулу внутри A1:

=MOD(QUOTIENT(ROW()-1,2^(COLUMN()-1)),2)

Затем перетащите-заполните до L4096 .

Скриншот

Формула извлекает n-й бит числа (n> = 0): число целое, деленное на 2 ^ n, затем вычисляется модуль 2.

9

Сначала введите следующую пользовательскую функцию в стандартный модуль:

Public Function BigBinary(r As Range) As String
    Dim addy As String, s1 As String, s2 As String

    addy = r.Address(0, 0)
    s1 = "=DEC2BIN(INT(A1/2^27),9)&DEC2BIN(INT(MOD(A1,2^27)/2^18),9)&DEC2BIN(INT(MOD(A1,2^18)/2^9),9)&DEC2BIN(MOD(A1,2^9),9)"
    s1 = Replace(s1, "A1", addy)
    s = Evaluate(s1)
    BigBinary = s
End Function

Это возвращает строку из 36 "битов". Затем в A1 введите:

=ROW()-1

и скопировать через A4096

В B1 введите:

=RIGHT(bigbinary(A1),12)

и скопируйте вниз через B4096:

демонстрация

Пользовательские функции (UDF) очень просты в установке и использовании:

  1. Alt - F11 открывает окно VBE
  2. Alt - I, Alt - M открывает свежий модуль
  3. вставьте материал и закройте окно VBE

Если вы сохраните книгу, UDF будет сохранен вместе с ней. Если вы используете версию Excel более поздней, чем в 2003 году, вы должны сохранить файл как .xlsm, а не .xlsx

Чтобы удалить UDF:

  1. откройте окно VBE, как указано выше
  2. очистить код
  3. закройте окно VBE

Чтобы использовать UDF из Excel:

=myfunction(A1)

Чтобы узнать больше о макросах в целом, смотрите:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

а также

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

а подробности о UDF смотрите в:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

Макросы должны быть включены, чтобы это работало!

3

Поместите следующую формулу в каждую ячейку от A до L, для всех строк от 1 до 4096

=IF(MOD(ROW() - 1, 2^(13 - COLUMN())) < 2^(12 - COLUMN()), 0, 1)

Если вы хотите, чтобы все было в строке с пробелами, похожими на те, что вы просили, поместите это в последний столбец

=A1 & " " & B1 & " " & C1 & " " & D1 & " " & E1 & " " & F1 & " " & G1 & " " & H1 & " " & I1 & " " & J1 & " " & K1 & " " & L1

Затем перетащите строки до M4096

Для более общего решения укажите число бит в некоторой ячейке, например Z1, или именованной ячейке, например NumOfBits и используйте следующую формулу

=IF(MOD(ROW() - 1, 2^(NumOfBits + 1 - COLUMN())) < 2^(NumOfBits - COLUMN()), 0, 1)

Его также можно легко изменить, чтобы использовать любую ячейку в качестве начальной, изменив смещение строки и столбца.

Оптимизированная версия с использованием побитовых операций вместо степеней:

=IF(BITAND(ROW() - 1, BITLSHIFT(1, 13 - COLUMN()) - 1) < BITLSHIFT(1, 12 - COLUMN()), 0, 1)

=IF(BITAND(ROW() - 1, BITLSHIFT(1, NumOfBits + 1 - COLUMN()) - 1) < BITLSHIFT(1, NumOfBits - COLUMN()), 0, 1)

Самый быстрый способ:

  • Скопируйте любую из приведенных выше формул
  • Нажмите F5 (или Ctrl+G) и введите A1:L4096, чтобы выбрать весь диапазон
  • Нажмите F2, затем Ctrl+V, чтобы вставить
  • Нажмите Ctrl+Shift+Enter. Boom. Вы сделали Не надо таскать

Это формула массива, которая намного быстрее вычисляется и создает файл намного меньшего размера.


Объяснение:

Если мы запишем все двоичные представления в строках сверху вниз, цикл переключения / переключения n-го бита (считая от lsb) равен 2 n. В каждом цикле первая половина (от 0 до 2 n-1 -1) будет 0, а последняя половина - 1. Например, lsb (первый бит справа) будет чередоваться каждые 2 1-1 = 1 бит, второй бит будет переключаться каждые 2 2-1 = 2 бита ...

В результате мы возьмем модуль 2 n, чтобы получить текущую позицию числа в цикле, если он меньше 2 n-1 , это нулевой бит, иначе он равен единице.

3

Другой способ, который я использовал:

  • Заполните от A1 до L1 нулями
  • В A2 напишите =1-A1
  • В B2 напишите =IF( AND( A1=1, A2=0), 1-B1, B1)
  • Скопируйте формулу B2 в C2:L2
  • Скопируйте строки A2:L2 в строки 3:4096

Это производит все двоичные строки по порядку, с наименьшими значащими битами в первом столбце. Последний ряд (4096) это все единицы.

Это не зависит от ROW() (так что его можно свободно перемещать), вы можете напрямую увеличить длину, и просто обобщать в недвоичные строки. Это также работает с LibreOffice Calc.

1

Поскольку вы ищете каждое 12-значное двоичное число, лучше всего использовать функцию "DEC2BIN" для каждого числа от 0 до 4095 (2 ^ 12-1). К сожалению, DEC2BIN работает только до 8 цифр, поэтому окончательная формула выглядит немного сложнее из-за конкатенации:

 =DEC2BIN(ROUNDDOWN(A1/256,0),4)&DEC2BIN(A1-256*ROUNDDOWN(A1/256,0), 8)

DEC2BIN принимает число для преобразования и количество цифр, которые вы хотите вывести. Я сложил 4 и 8, чтобы получить 12. Чтобы сдвинуть первые 4 цифры до максимального значения, я делю на 256 (2 ^ 8) и округляю вниз, чтобы игнорировать другие младшие цифры. Для цифр с более низким значением вычтите это значение, чтобы они продолжали считать после 255.

Ищите десятичное в двоичное преобразование и сдвиг бит, чтобы понять, как это работает.

-1

Ответ, который создает данные за пределами Excel, но создает .csv, который можно открыть, чтобы получить таблицу в Excel.

Это использует Python, но может быть сделано и на языке оболочки. Просто запустите его в cmd.exe, если установлен Python.

python -c "for i in range(0,2**12): print (','.join((j for j in '{:b}'.format(i).zfill(12))))" > binary.csv

Это создает файл (binary.csv), который содержит желаемое содержимое, каждая цифра в отдельных ячейках, как (я думаю) желательно из вопроса.

объяснение:

python -c                    < call python passing in a string for the program to run
for i in range(0,2**12):     < for each value from 0 to 12 bits
print (                      < print...
','.join(                    < comma separated...
(j for j in                  < each character from...
'{:b}'.format(i)             < binary representation of current value
.zfill(12))))"               < padded with '0' to length 12
> binary.csv                 < and output to 'binary.csv'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .