Как создать таблицу со всеми комбинациями 0 и 1

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

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

Пабло Дурбин Спраке Мартинес
источник
какую версию Excel вы используете?
Máté Juhász
support.office.com/en-us/article/…
Я говорю, восстановите Монику
1
Он может разбить двоичное число на старшую и младшую часть, а затем использовать Конкатенацию, чтобы соединить две части вместе.
Я говорю Восстановить Монику
8
Исходя из вашего представления желаемого результата, могу ли я считать, что каждая цифра должна быть в отдельной ячейке, а не в одной строке?
Baldrickk
4
Для дальнейшего использования, способ поблагодарить людей на Stack Exchange использует эту кнопку ▲. Для ответа, который работал для вас (и дал правильный результат), используйте эту кнопку ✔. Если работает более одного ответа, выберите тот, который вам нравится больше всего.
wizzwizz4

Ответы:

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)

Поместите это в ячейки А1-А4096.

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

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

во все ячейки от А1 до L 4096.

трава
источник
23

Просто скопируйте и вставьте следующую формулу внутрь 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

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

Ученик Гэри
источник
Конечно, можно просто использовать =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4
@ wizzwizz4 Вы правы ... с небольшим изменением UDF ()
Gary's Student
Я только что прочитал макрос и заметил, что он излишний - вы можете просто вставить формулу прямо в поле, а затем использовать функцию перетаскивания мышью в Excel, чтобы изменить все ссылки на ячейки, или, что еще лучше, просто использовать ROW() - 1вместо ячейки ссылка. В файле с макросами это нормально, но в одном без него создается раздражающее и страшно выглядящее всплывающее окно.
wizzwizz4
1
@ wizzwizz4 Я использовал этот UDF (), потому что он уже был у меня в наборе инструментов VBA
Gary's Student
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.

leonbloy
источник
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 , это нулевой бит, иначе он равен единице.

phuclv
источник
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.

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

Gops
источник
1
Хорошая работа по «кодированию гольфа» (создание более короткого текста) по сравнению с ответом @Herb, хотя кажется, что вы жестко закодировали A1, где он использует более гибкий ROW (). Почему он говорит, что это работает до 511, а вы говорите 255. Один из вас выключен, или это разница в разных версиях Excel?
ТООГАМ
вместо ROUNDDOWN(A1/256,0)тебя можно просто использовать QUOTIENT(A1, 256)или даже лучше BITRSHIFT(A1, 8). Последняя часть также может быть заменена BITANDилиMOD
phuclv
-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'
Baldrickk
источник
4
Я не голосующий вниз, но "В Excel мне нужно создать ...". Это не в Excel. Импорт CSV и копирование ячеек в нужное место в любое время, когда вы хотите изменить его (например, больше / меньше строк), было бы проблематично.
Том Карпентер
Это для Python <3, но> = 2.3. Для прямой совместимости, пожалуйста, добавьте скобки, чтобы printключевое слово называлось как функция - таким образом, оно будет совместимо с Python 2.3+ и Python 3.0.0+
wizzwizz4