Як створити таблицю з усіма комбінаціями 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


1
Він може розділити двійкове число на частину високого та низького порядку, а потім використовувати Concatenate для зшивання двох частин разом.
Я кажу, відновіть Моніку

8
З вашого представлення бажаного виводу, я можу вважати, що кожна цифра повинна бути в окремій комірці, а не в одному рядку?
Балдрік

4
Для подальшої довідки спосіб подякувати людям на Stack Exchange використовує цю кнопку ▲. Для відповіді, яка працювала для вас (і дала правильний результат), використовуйте цю кнопку ✔. Якщо більш ніж одна відповідь працює, виберіть ту, яка вам найбільше подобається.
wizzwizz4

Відповіді:


27

Оскільки 2 ^ 12 = 4096, вам потрібно 4096 комірок (12 для ваших 12 біт).

В принципі, ви вводите в А1 до А4096 цю команду:

=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: Відповідно до коментаря Lưu 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 "біт". Потім в А1 введіть:

=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

а детальну інформацію про ФДД див.

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

Макроси повинні бути включені, щоб це працювало!


Звичайно, можна просто скористатися =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4

@ wizzwizz4 Ви маєте рацію ... з невеликою зміною UDF ()
студент Гері

Я щойно прочитав макрос і помітив, що він є надмірним - ви можете просто вставити формулу прямо у поле, а потім використовувати функцію клацання / перетягування Excel, щоб змінити всі посилання на комірки або - ще краще, просто використовувати ROW() - 1замість комірки довідник. У файлі з макросами це добре, але в одному без нього створюється дратівливе і страшно виглядає спливаюче вікно.
wizzwizz4

1
@ wizzwizz4 Я використав цей UDF (), тому що він уже був у своєму інструментарі VBA
студент Гері

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.


3

Поставте наступну формулу в кожну клітинку від А до 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. Бум. Ви закінчили. Не потрібно тягнути

Це формула масиву, яка набагато швидше обчислити і створити набагато менший файл


Пояснення:

Якщо ми запишемо всі бінарні уявлення рядками зверху вниз, цикл перегортання / перемикання 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 - це нульовий біт, інакше - одиничне.


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
Хороша робота "кодування в гольф" (створення коротшого тексту) порівняно з відповіддю @Herb, хоча здається, що ви жорсткий код A1, де він використовує більш гнучку ROW (). Чому він каже, що це працює через 511, але ви говорите 255. Чи хтось із вас відключений, чи це різниця в різних версіях Excel?
TOOGAM

замість 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'

4
Я не виборець, але "В Excel мені потрібно генерувати ...". Це не в відмінності. Імпорт CSV та копіювання комірок у потрібне місце в будь-який час, коли ви хочете змінити його (наприклад, більше / менше рядків) буде болем.
Том Карпентер

Це для Python <3, але> = 2,3. Для сумісності форвардів додайте дужки, щоб printключове слово називалося функцією - таким чином воно буде сумісне з Python 2.3+ та Python 3.0.0+
wizzwizz4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.