0 ve 1'in tüm kombinasyonlarını içeren bir tablo nasıl oluşturulur?


15

Excel'de, 12 boşluk için tüm 1 ve 0 kombinasyonlarını içeren bir tablo oluşturmam gerekiyor.

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

ve benzeri ve benzeri tüm kombinasyonları elde etme

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

Bunu nasıl yapabilirim?


Excel'in hangi sürümünü kullanıyorsunuz?
Máté Juhász


1
İkili sayıyı yüksek dereceli ve düşük dereceli bir bölüme ayırabilir, ardından iki parçayı birbirine dikmek için Birleştir'i kullanabilir.
Twisty Impersonator

8
İstediğiniz çıktının gösterimine göre, her basamağın ayrı bir hücrede olması gerektiğini, bir dizgide olmaması gerektiğini mi belirleyeceğim?
Baldrickk

4
Gelecekte referans olması için, Stack Exchange'deki kişilere teşekkür etmenin yolu ▲ düğmesini kullanmaktır. Sizin için işe yarayan (ve doğru sonucu veren) cevap için ✔ düğmesini kullanın. Birden fazla cevap işe yararsa, en çok beğendiğinizi seçin.
wizzwizz4

Yanıtlar:


27

Çünkü 2 ^ 12 = 4096, 4096 hücreye ihtiyacınız var (12 bitiniz için 12).

Prensip olarak, bu komutu A1'den A4096'ya koydunuz:

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

Öyle olurdu, ama yalnızca 0 ... 511 (9 bit) için çalışıyor. Böylece bir hile uyguluyoruz: sayıyı 3 bit ve 9 bitlik bir bölüme ayırıyoruz ve iki dizgiyi ayrı ayrı hesaplıyoruz, sonra birleştiriyoruz.

Dolayısıyla sizde:

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

Düzenle: İsteğe bağlı basamak argüman sayısının farkında değildim. Bunu kullanmak bu işlevi verecektir:

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

Bunu A1 ila A4096 hücrelerine yerleştirin.

Düzenleme 2: Lưu Vcnh Phúc'ın yorumuna göre, OP'nin her biri bir ikili rakam olan 12 sütun istedi. Bu durumda, koymak

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

tüm hücrelere A1 ila L 4096.


22

Sadece aşağıdaki formülü kopyalayıp yapıştırın A1:

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

Sonra yukarı sürükleyin L4096.

Screenshot

Formül, sayının bit bitini (n> gt = 0) alır: sayı tam sayı 2 ^ n'ye bölünür, ardından modül 2'yi hesaplar.


9

İlk önce standart bir modüle aşağıdaki Kullanıcı Tanımlı Fonksiyonu girin:

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

Bu 36 "bit" dizesini döndürür. Daha sonra A1 girmek:

=ROW()-1

ve aşağı kopyalayın A4096

İçinde B1 girmek:

=RIGHT(bigbinary(A1),12)

ve aşağı kopyalayın B4096 :

demo

Kullanıcı Tanımlı İşlevlerin (UDF'ler) kurulumu ve kullanımı çok kolaydır:

  1. Alt - F11 VBE penceresini açar
  2. Alt - ben , Alt - M yeni bir modül açar
  3. öğeleri yapıştırın ve VBE penceresini kapatın

Çalışma kitabını kaydederseniz, UDF onunla birlikte kaydedilir. Excel'in daha sonra 2003 sürümünü kullanıyorsanız, kaydetmeniz gerekir. .xlsx yerine .xlsm dosyası.

UDF'yi kaldırmak için:

  1. VBE penceresini yukarıdaki gibi açın
  2. kodu temizle
  3. VBE penceresini kapatın

Excel'den UDF'yi kullanmak için:

=myfunction(A1)

Genel olarak makrolar hakkında daha fazla bilgi için bkz.

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

ve

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

ve UDF'lerle ilgili ayrıntılar için, bakınız:

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

Bunun çalışması için makrolar etkinleştirilmelidir!


Elbette bir kişi kullanabilir =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4

@ wizzwizz4 Haklısın ... UDF ()
Gary's Student

Makroyu yeni okudum ve bunun aşırı olduğunu farkettim - formülü doğrudan kutuya doğrudan yapıştırabilir, ardından tüm hücre referanslarını değiştirmek için Excel'in tıklama / sürükleme işlevini kullanabilirsiniz veya - daha iyisi, sadece kullanın ROW() - 1 hücre başvurusu yerine. Makro içeren bir dosyada sorun yoktur, ancak bir tanesinde sinir bozucu ve korkutucu görünen bir açılır pencere oluşturur.
wizzwizz4

1
@ wizzwizz4 Bunu kullandım UDF () çünkü zaten VBA araç kutumda vardı
Gary's Student

3

Aşağıdaki formülü 1 ila 4096 arasındaki bütün satırlar için A'dan L'ye her hücreye yerleştirin.

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

Her şeyi bir dizgede istiyorsan boşluklu İstediğin gibi, bunu da son sütuna koy.

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

A4096: L4096'ya kadar tüm yolu sürükleyin

Genel bir çözüm için, Z1 gibi bazı hücrelere bit sayısını veya benzeri hücreye adlandırılmış NumOfBits ve aşağıdaki formülü kullanın

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

Optimize edilmiş versiyon:

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

Açıklama:

Tüm ikili gösterimleri satırlar halinde yukarıdan aşağıya yazarsak, nth-bit'in çevirme / değiştirme döngüsü (lsb'den sayım) 2 olur. n . Her çevrimde ilk yarı (0'dan 2'ye kadar) N-1 -1) 0 olur ve son yarı 1 olur. Örneğin, lsb (sağdan ilk bit) her 2'yi değiştirir 1-1 = 1 bit, ikinci bit her 2'yi değiştirir 2-1 = 2 bit ...

Sonuç olarak modulo 2'yi alacağız. n 2'den küçükse, sayının döngüdeki geçerli konumunu almak için N-1 bu sıfır biti, yoksa bir tane.


3

Kullandığım başka bir yol:

  • Dan doldur A1 için L1 sıfır ile
  • İçinde A2 yazmak =1-A1
  • İçinde B2 yazmak =IF( AND( A1=1, A2=0), 1-B1, B1)
  • kopya B2 formülüne C2:L2
  • Satır kopyala A2:L2 satır formülleri 3:4096

Bu, ilk sütunda en az önemli bit olan tüm ikili dizeleri sırayla üretir. Son satır (4096) hepsidir.

Bu güvenmiyor ROW() (böylece serbestçe hareket ettirilebilir), uzunluğunu doğrudan artırabilir ve ikili olmayan dizgilere genellemek için doğrudan basittir. Aynı zamanda LibreOffice Calc ile çalışır.


1

Aradığın her 12 basamaklı ikili sayı olduğundan, en iyi bahis, 0 ila 4095 (2 ^ 12-1) arasındaki her sayıdaki "DEC2BIN" işlevini kullanmaktır. Ne yazık ki DEC2BIN sadece 8 basamağa kadar çalışıyor, bu yüzden son formül biraz birleştirici görünüyor çünkü biraz zor görünüyor:

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

DEC2BIN, dönüştürülecek sayı ile çıktı almak istediğiniz sayı sayısını alır. 12 ve 4'ü birleştirdim. İlk 4 haneyi en yüksek değere kaydırmak için 256 (2 ^ 8) bölüp diğer düşük değerli haneleri yoksaymak için aşağı yuvarlayın. Düşük değer haneleri için bu değeri 255'i geçmeye devam edecek şekilde çıkarın.

Nasıl çalıştığını anlamak için ikili dönüşüm ve bit kaydırma için ondalık arayın.


1
Güzel iş "kod golfü" (daha kısa metin oluşturma), @Herb'in cevabına kıyasla daha zor bir ROW () kullandığı A1 kodunu görüyor olmasına rağmen. Neden 511'e kadar çalıştığını söylüyor ama 255 diyorsunuz. Sizden biri mi yoksa farklı Excel sürümlerinde bir fark mı var?
TOOGAM

yerine ROUNDDOWN(A1/256,0) sadece kullanabilirsin QUOTIENT(A1, 256)veya daha da iyisi BITRSHIFT(A1, 8). Son kısım ayrıca ile değiştirilebilir BITAND veya MOD
phuclv

-1

Verileri excel dışında yaratan, ancak tabloyu excel içine almak için açılabilen bir .csv oluşturan cevap.

Bu python kullanır, ancak bir kabuk dilinde de yapılabilir. Python yüklü ise sadece cmd.exe çalıştırın.

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

Bu, istenen içeriği içeren bir dosya (binary.csv) oluşturur, her basamağın ayrı hücrelerde (sanırım) sorudan istendiği gibi.

açıklama:

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
Aşağı seçmen değilim, ama "Excel'de, oluşturmam gerekiyor ...". Bu mükemmel değil. Bir CSV'yi içe aktarmak ve hücreleri istediğiniz zaman (örneğin daha fazla / daha az satır) değiştirmek istediğiniz zaman doğru yere kopyalamak acı verici olacaktır.
Tom Carpenter

Bu Python için <3 ancak <= 2.3. İleriye dönük uyumluluk için, lütfen print Anahtar sözcük bir işlev gibi adlandırılır - bu şekilde Python 2.3+ ve Python 3.0.0+ ile uyumlu olur
wizzwizz4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.