Cara membuat tabel dengan semua kombinasi 0 dan 1

15

Di Excel, saya perlu membuat tabel dengan semua kombinasi 1 dan 0 untuk 12 spasi.

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

dan seterusnya dan seterusnya, dapatkan semua kombinasi seperti

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

Bagaimana saya bisa melakukan ini?

Pablo Durbin Sprake Martínez
sumber
versi Excel apa yang Anda gunakan?
Máté Juhász
support.office.com/en-us/article/…
Saya katakan Reinstate Monica
1
Dia dapat membagi angka biner menjadi bagian orde tinggi dan orde rendah, kemudian menggunakan Concatenate untuk menjahit kedua bagian tersebut.
Saya katakan Reinstate Monica
8
Dari representasi Anda dari output yang diinginkan, apakah saya harus mengatakan bahwa setiap digit harus dalam sel yang terpisah dan bukan dalam satu string?
Baldrickk
4
Untuk referensi di masa mendatang, cara berterima kasih kepada orang-orang di Stack Exchange menggunakan tombol ▲. Untuk jawaban yang cocok untuk Anda (dan memberikan hasil yang tepat), gunakan tombol ✔ itu. Jika lebih dari satu jawaban berfungsi, pilih satu yang paling Anda sukai.
wizzwizz4

Jawaban:

27

Karena 2 ^ 12 = 4096, Anda membutuhkan 4096 sel (12 untuk 12 bit Anda).

Pada prinsipnya, Anda memasukkan perintah A1 ke A4096:

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

Itu saja, tetapi hanya berfungsi untuk 0 ... 511 (9 bit). Jadi kami menerapkan trik: kami membagi angka menjadi 3 bit dan bagian 9 bit dan menghitung dua string secara terpisah, kemudian menggabungkannya.

Maka dari itu Anda memiliki:

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

Sunting: Saya tidak mengetahui jumlah argumen digit opsional. Menggunakannya akan memberikan fungsi ini:

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

Masukkan ini ke dalam sel A1 hingga A4096.

Sunting 2: Sesuai komentar Lưu Vĩnh Phúc, ada kemungkinan OP menginginkan 12 kolom dengan masing-masing satu digit biner. Dalam hal ini, masukkan

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

ke semua sel A1 hingga L 4096.

Herba
sumber
23

Cukup salin-tempel rumus berikut di dalam A1:

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

Kemudian seret-isi hingga L4096.

Tangkapan layar

Rumus ini mengekstrak bit ke-n angka (n> = 0): angka tersebut bilangan bulat dibagi 2 ^ n, kemudian menghitung modulus 2.

Salman A
sumber
9

Pertama-tama masukkan Fungsi Buatan Pengguna berikut dalam modul standar:

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

Ini mengembalikan string 36 "bit". Kemudian di A1 masukkan:

=ROW()-1

dan salin melalui A4096

Di B1 masukkan:

=RIGHT(bigbinary(A1),12)

dan salin melalui B4096 :

demo

Fungsi yang Ditentukan Pengguna (UDF) sangat mudah dipasang dan digunakan:

  1. Alt- F11Menampilkan jendela VBE
  2. Alt- I, Alt- Mmembuka modul baru
  3. rekatkan barang-barang di dan tutup jendela VBE

Jika Anda menyimpan buku kerja, UDF akan disimpan bersamanya. Jika Anda menggunakan versi Excel di atas 2003, Anda harus menyimpan file sebagai .xlsm daripada .xlsx

Untuk menghapus UDF:

  1. buka jendela VBE seperti di atas
  2. hapus kode
  3. tutup jendela VBE

Untuk menggunakan UDF dari Excel:

=myfunction(A1)

Untuk mempelajari lebih lanjut tentang makro secara umum, lihat:

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

dan

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

dan untuk spesifik tentang UDF, lihat:

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

Makro harus diaktifkan agar ini berfungsi!

Siswa Gary
sumber
Tentunya orang hanya bisa menggunakan =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4
@ wizzwizz4 Anda benar ... dengan sedikit perubahan pada UDF ()
Siswa Gary
Saya baru saja membaca makro dan memperhatikan bahwa itu berlebihan - Anda bisa menempelkan rumus langsung ke kotak kemudian menggunakan fungsi klik / seret Excel untuk mengubah semua referensi sel atau - lebih baik lagi, cukup gunakan ROW() - 1alih-alih sel referensi. Dalam file dengan makro tidak apa-apa, tetapi dalam satu tanpa itu menciptakan popup yang menjengkelkan dan menakutkan.
wizzwizz4
1
@ wizzwizz4 Saya menggunakan UDF ini () karena saya sudah memilikinya di kotak alat VBA saya
Siswa Gary
3

Cara lain saya telah menggunakan:

  • Isi dari A1hingga L1dengan nol
  • Dalam A2menulis=1-A1
  • Dalam B2menulis=IF( AND( A1=1, A2=0), 1-B1, B1)
  • Salin B2rumus keC2:L2
  • Salin A2:L2rumus baris ke baris3:4096

Ini menghasilkan semua string biner secara berurutan, dengan bit paling tidak signifikan pada kolom pertama. Baris terakhir (4096) adalah semuanya.

Ini tidak bergantung pada ROW()(sehingga dapat dipindahkan secara bebas), Anda dapat menambah panjangnya secara langsung, dan sangat mudah untuk menggeneralisasi ke string non-biner. Ini juga bekerja dengan LibreOffice Calc.

leonbloy
sumber
3

Masukkan formula berikut di setiap sel dari A ke L, untuk semua baris dari 1 hingga 4096

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

Jika Anda ingin semuanya dalam string dengan spasi seperti apa yang Anda minta, letakkan ini di kolom terakhir

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

Lalu seret baris sampai M4096

Untuk solusi yang lebih umum, masukkan jumlah bit dalam beberapa sel, seperti Z1, atau sel bernama NumOfBitsdan gunakan rumus berikut

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

Itu juga dapat dengan mudah dimodifikasi untuk menggunakan sel apa pun sebagai sel awal dengan mengubah offset baris dan kolom

Versi yang dioptimalkan menggunakan operasi bitwise bukannya kekuatan:

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

Cara tercepat:

  • Salin salah satu rumus di atas
  • Tekan F5(atau Ctrl+ G) dan masukkan A1: L4096 untuk memilih seluruh rentang
  • Tekan F2lalu Ctrl+ Vuntuk menempel
  • Tekan Ctrl+ Shift+ Enter. Ledakan. Kamu sudah selesai. Tidak perlu diseret

Ini adalah formula array yang jauh lebih cepat untuk menghitung dan menghasilkan file yang jauh lebih kecil


Penjelasan:

Jika kita menulis semua representasi biner dalam baris dari atas ke bawah, siklus flipping / toggling dari bit-n (menghitung dari lsb) adalah 2 n . Dalam setiap siklus, setengah pertama (dari 0 hingga 2 n-1 -1) akan menjadi 0 dan setengah terakhir adalah 1. Misalnya lsb (bit pertama dari kanan) akan berganti setiap 2 1-1 = 1 bit, bit kedua akan beralih setiap 2 2-1 = 2 bit ...

Sebagai hasilnya, kita akan mengambil modulo 2 n untuk mendapatkan posisi nomor saat ini dalam siklus, jika kurang dari 2 n-1 itu nol sedikit, selain itu satu.

phuclv
sumber
1

Karena yang Anda cari adalah setiap 12 digit angka biner, taruhan terbaik Anda adalah menggunakan fungsi "DEC2BIN" pada setiap angka dari 0 hingga 4095 (2 ^ 12-1). Sayangnya DEC2BIN hanya bekerja hingga 8 digit sehingga rumus akhir terlihat sedikit rumit karena terdiri dari:

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

DEC2BIN mengambil nomor untuk dikonversi dan jumlah digit yang ingin Anda hasilkan. Saya menggabungkan 4 dan 8 untuk mendapatkan 12. Untuk menggeser 4 digit pertama hingga nilai tertinggi saya bagi dengan 256 (2 ^ 8) dan bulatkan untuk mengabaikan digit nilai yang lebih rendah lainnya. Untuk digit nilai yang lebih rendah kurangi nilai ini sehingga mereka akan terus menghitung melewati 255.

Cari konversi desimal ke biner dan pergeseran bit untuk memahami cara kerjanya.

Polisi
sumber
1
Pekerjaan yang bagus "kode golf" (membuat teks lebih pendek) dibandingkan dengan jawaban @Herb, meskipun tampaknya Anda hard-kode A1 di mana ia menggunakan ROW yang lebih fleksibel (). Mengapa dia mengatakan itu bekerja sampai 511 tetapi Anda mengatakan 255. Apakah salah satu dari Anda tidak aktif, atau perbedaan dalam versi Excel yang berbeda?
TOOGAM
alih-alih ROUNDDOWN(A1/256,0)Anda hanya dapat menggunakan QUOTIENT(A1, 256), atau bahkan lebih baik BITRSHIFT(A1, 8). Bagian terakhir juga dapat diganti dengan BITANDatauMOD
phuclv
-1

Jawaban yang membuat data di luar excel, tetapi menciptakan .csv yang bisa dibuka untuk mendapatkan tabel di excel.

Ini menggunakan python, tetapi bisa dilakukan dalam bahasa shell juga. Jalankan saja di cmd.exe jika python diinstal.

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

Ini menciptakan file (binary.csv) yang berisi konten yang diinginkan, setiap digit dalam sel yang terpisah seperti (saya pikir) diinginkan dari pertanyaan.

penjelasan:

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
sumber
4
Saya bukan pemilih bawah, tetapi "Di Excel, saya perlu membuat ...". Ini bukan di excel. Mengimpor CSV dan menyalin sel ke tempat yang tepat setiap kali Anda ingin memodifikasinya (mis. Baris lebih / kurang) akan menyusahkan.
Tom Carpenter
Ini untuk Python <3 tetapi> = 2.3. Untuk kompatibilitas ke depan, harap tambahkan tanda kurung sehingga printkata kunci disebut seperti fungsi - dengan cara itu akan kompatibel dengan Python 2.3+ dan Python 3.0.0+
wizzwizz4