Jak utworzyć tabelę ze wszystkimi kombinacjami 0 i 1

15

W programie Excel muszę wygenerować tabelę ze wszystkimi kombinacjami 1 i 0 dla 12 spacji.

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

i tak dalej, i tak dalej, otrzymując wszystkie kombinacje, takie jak

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

W jaki sposób mogę to zrobić?

Pablo Durbin Sprake Martínez
źródło
jakiej wersji programu Excel używasz?
Máté Juhász
support.office.com/en-us/article/…
Mówię Przywróć Monikę
1
Może podzielić liczbę binarną na część wyższego i niższego rzędu, a następnie użyć konkatenatu, aby połączyć dwie części razem.
Mówię: Przywróć Monikę
8
Czy na podstawie reprezentacji pożądanego wyniku mam przyjąć, że każda cyfra powinna znajdować się w osobnej komórce, a nie w jednym ciągu?
Baldrickk
4
Aby w przyszłości skorzystać z podziękowań dla osób korzystających z Stack Exchange, użyj tego przycisku ▲. Aby uzyskać odpowiedź, która zadziałała (i dała właściwy wynik), użyj tego przycisku ✔. Jeśli działa więcej niż jedna odpowiedź, wybierz tę, która najbardziej Ci się podoba.
wizzwizz4

Odpowiedzi:

27

Ponieważ 2 ^ 12 = 4096, potrzebujesz 4096 komórek (12 dla 12 bitów).

Zasadniczo wstawiasz do A1 do A4096 to polecenie:

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

To by było na tyle, ale działa tylko dla 0 ... 511 (9 bitów). Dlatego stosujemy sztuczkę: dzielimy liczbę na 3-bitową i 9-bitową część i obliczamy dwa ciągi oddzielnie, a następnie łączymy je.

Dlatego masz:

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

Edycja: Nie wiedziałem o opcjonalnym argumencie liczby cyfr. Korzystanie z niego da tę funkcję:

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

Umieść to w komórkach A1 do A4096.

Edycja 2: Zgodnie z komentarzem Lưu Vĩnh Phúca możliwe jest, że OP chciał 12 kolumn z jedną cyfrą binarną każda. W takim przypadku umieść

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

do wszystkich komórek A1 do L 4096.

Ziele
źródło
23

Wystarczy skopiować i wkleić w środku następującą formułę A1:

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

Następnie przeciągnij i wypełnij do L4096.

Zrzut ekranu

Formuła wyodrębnia n-ty bit liczby (n> = 0): liczba jest liczbą całkowitą podzieloną przez 2 ^ n, a następnie oblicz moduł 2.

Salman A.
źródło
9

Najpierw wprowadź następującą funkcję zdefiniowaną przez użytkownika w standardowym module:

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

Zwraca ciąg 36 „bitów”. Następnie w A1 wprowadź:

=ROW()-1

i skopiuj do A4096

W B1 wpisz:

=RIGHT(bigbinary(A1),12)

i skopiuj do B4096 :

próbny

Funkcje zdefiniowane przez użytkownika (UDF) są bardzo łatwe w instalacji i obsłudze:

  1. Alt- F11wywołuje okno VBE
  2. Alt- I, Alt- Motwiera nowy moduł
  3. wklej rzeczy i zamknij okno VBE

Jeśli zapiszesz skoroszyt, UDF zostanie z nim zapisany. Jeśli używasz wersji Excela późniejszej niż 2003, musisz zapisać plik jako .xlsm zamiast .xlsx

Aby usunąć UDF:

  1. wywołać okno VBE jak wyżej
  2. wyczyść kod
  3. zamknij okno VBE

Aby użyć UDF z Excela:

=myfunction(A1)

Aby dowiedzieć się więcej o makrach, zobacz:

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

i

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

a szczegółowe informacje na temat UDF można znaleźć:

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

Makra muszą być włączone, aby to działało!

Uczeń Gary'ego
źródło
Z pewnością można po prostu użyć =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4
@ wizzwizz4 Masz rację ... z niewielką zmianą w UDF ()
Gary's Student
Właśnie przeczytałem makro i zauważyłem, że to przesada - możesz po prostu wkleić formułę bezpośrednio do pola, a następnie użyć funkcji Excela do klikania / przeciągania, aby zmienić wszystkie odwołania do komórek lub - lepiej, po prostu użyj ROW() - 1zamiast komórki odniesienie. W pliku z makrami jest w porządku, ale w jednym bez tworzy irytujące i przerażające wyskakujące okienko.
wizzwizz4
1
@ wizzwizz4 Użyłem tego UDF (), ponieważ miałem go już w moim zestawie narzędzi VBA
Gary's Student
3

Inny sposób użyłem:

  • Wypełnij od A1do L1zerami
  • W A2piśmie=1-A1
  • W B2piśmie=IF( AND( A1=1, A2=0), 1-B1, B1)
  • Skopiuj B2formułę doC2:L2
  • Skopiuj A2:L2formuły wierszy do wierszy3:4096

To produkuje wszystkie ciągi binarne w kolejności, z najmniej znaczącymi bitami w pierwszej kolumnie. Ostatni wiersz (4096) to wszystko.

Nie zależy to od ROW()(więc można go swobodnie przenosić), możesz bezpośrednio zwiększyć długość i łatwo jest uogólnić na ciągi niebinarne. Działa również z LibreOffice Calc.

leonbloy
źródło
3

Umieść następującą formułę w każdej komórce od A do L, dla wszystkich wierszy od 1 do 4096

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

Jeśli chcesz wszystko w ciągu ze spacjami takimi jak to, o co prosiłeś, umieść to w ostatniej kolumnie

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

Następnie przeciągnij rzędy do końca, aż do M4096

Aby uzyskać bardziej ogólne rozwiązanie, umieść liczbę bitów w jakiejś komórce, na przykład Z1, lub nazwie podobnej komórki NumOfBitsi użyj następującej formuły

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

Można go również łatwo zmodyfikować, aby używał dowolnej komórki jako komórki początkowej, zmieniając przesunięcie wiersza i kolumny

Zoptymalizowana wersja wykorzystująca operacje bitowe zamiast uprawnień:

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

Najszybszy sposób:

  • Skopiuj jedną z powyższych formuł
  • Naciśnij F5(lub Ctrl+ G) i wprowadź A1: L4096, aby wybrać cały zakres
  • Naciśnij, F2a następnie Ctrl+, Vaby wkleić
  • Naciśnij Ctrl+ Shift+ Enter. Bum. Jesteś skończony. Nie trzeba przeciągać

Jest to formuła tablicowa, która jest znacznie szybsza do obliczenia i utworzenia znacznie mniejszego pliku


Wyjaśnienie:

Jeśli napiszemy wszystkie reprezentacje binarne w rzędach od góry do dołu, cykl odwracania / przełączania n-tego bitu (licząc od lsb) wynosi 2 n . W każdym cyklu pierwsza połowa (od 0 do 2 n-1 -1) będzie wynosić 0, a ostatnia połowa będzie wynosić 1. Na przykład lsb (pierwszy bit od prawej) będzie się zmieniał co 2 1-1 = 1 bit, drugi bit będzie się przełączał co 2 2-1 = 2 bity ...

W rezultacie weźmiemy modulo 2 n, aby uzyskać bieżącą pozycję liczby w cyklu, jeśli jest mniejsza niż 2 n-1 , jest to zero bitów, w przeciwnym razie to jeden.

phuclv
źródło
1

Ponieważ szukasz każdej 12-cyfrowej liczby binarnej, najlepszym rozwiązaniem jest użycie funkcji „DEC2BIN” dla każdej liczby od 0 do 4095 (2 ^ 12-1). Niestety DEC2BIN działa tylko do 8 cyfr, więc końcowa formuła wygląda nieco skomplikowana, ponieważ jest to konkatenacja:

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

DEC2BIN pobiera liczbę do konwersji i liczbę cyfr, które chcesz wyprowadzić. Połączyłem 4 i 8, aby uzyskać 12. Aby przesunąć pierwsze 4 cyfry w górę do najwyższej wartości, dzielę przez 256 (2 ^ 8) i zaokrąglam w dół, aby zignorować pozostałe cyfry o niższej wartości. Dla cyfr o niższej wartości odejmij tę wartość, aby kontynuować liczenie po 255.

Wyszukaj konwersję dziesiętną na binarną i przesunięcie bitów, aby zrozumieć, jak to działa.

Gops
źródło
1
Niezła robota „kodowanie w golfa” (tworzenie krótszego tekstu) w porównaniu z odpowiedzią @Herb, chociaż wydaje się, że kodujesz A1 na sztywno, gdy używa bardziej elastycznego ROW (). Dlaczego mówi, że działa aż do 511, a ty mówisz 255. Czy jedno z was jest wyłączone, czy różni się w różnych wersjach Excela?
TOOGAM
zamiast ROUNDDOWN(A1/256,0)ciebie możesz po prostu użyć QUOTIENT(A1, 256)lub nawet lepiej BITRSHIFT(A1, 8). Tę ostatnią część można również zastąpić BITANDlubMOD
phuclv
-1

Odpowiedź, która tworzy dane poza programem Excel, ale tworzy plik .csv, który można otworzyć, aby uzyskać tabelę w programie Excel.

Używa Pythona, ale można to również zrobić w języku powłoki. Wystarczy uruchomić go w cmd.exe, jeśli jest zainstalowany Python.

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

Spowoduje to utworzenie pliku (binary.csv), który zawiera pożądaną treść, a każda cyfra w osobnych komórkach jest (jak sądzę) pożądana z pytania.

wyjaśnienie:

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
źródło
4
Nie jestem zagłosowanym, ale „W programie Excel muszę wygenerować ...”. To nie jest w Excelu. Importowanie pliku CSV i kopiowanie komórek we właściwe miejsce za każdym razem, gdy chcesz je zmodyfikować (np. Więcej / mniej wierszy) byłoby uciążliwe.
Tom Carpenter
Dotyczy to języka Python <3, ale> = 2.3. Aby printzapewnić zgodność z poprzednimi wersjami, dodaj nawiasy klamrowe, aby słowo kluczowe było wywoływane jak funkcja - w ten sposób będzie ono kompatybilne z Python 2.3+ i Python 3.0.0+
wizzwizz4