0と1のすべての組み合わせでテーブルを作成する方法


15

Excelでは、12個のスペースに対して1と0のすべての組み合わせでテーブルを生成する必要があります。

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を使用していますか?
マテユハス


1
2進数を高次と低次の部分に分割し、連結を使用して2つの部分をつなぎ合わせることができます。
私は言う

8
目的の出力の表現から、各数字は1つの文字列ではなく別々のセルにあるべきだと思いますか?
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ビットの部分に分割し、2つの文字列を別々に計算してから、それらを連結します。

したがって、次のものがあります。

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

これをセルA1〜A4096に入れます。

編集2: LưuVĩnhPhúcのコメントによると、OPはそれぞれ1つの2進数で12列を望んでいた可能性があります。この場合、

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

すべてのセルA1から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- F11VBEのウィンドウが表示されます
  2. Alt- IAlt- M新しいモジュールを開きます
  3. ものを貼り付けて、VBEウィンドウを閉じます

ブックを保存すると、UDFも一緒に保存されます。2003年以降のバージョンのExcelを使用している場合、.xlsxではなく.xlsmとしてファイルを保存する必要があります。

UDFを削除するには:

  1. 上記のようにVBEウィンドウを表示します
  2. コードをクリアする
  3. VBEウィンドウを閉じます

ExcelからUDFを使用するには:

=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()に
ゲイリーの学生

私はマクロを読んで、それはやり過ぎだと気づいた-あなただけのセル参照のすべてを変更したりするために、Excelのクリック/ドラッグ機能を使用して、ボックスに直接数式を貼り付けることができ-より良いまだ、ちょうど使用ROW() - 1セルの代わりに参照。マクロを含むファイルでは問題ありませんが、マクロを含まないファイルでは、刺激的で恐ろしい外観のポップアップが作成されます。
wizzwizz4

1
@ wizzwizz4私はこの使用UDFを()私はすでに私のVBAツールボックスでそれを持っていたので
ゲイリーの学生

3

私が使用した別の方法:

  • からA1L1ゼロで埋める
  • A2書き込み=1-A1
  • B2書き込み=IF( AND( A1=1, A2=0), 1-B1, B1)
  • B2数式をコピーするC2:L2
  • 行のA2:L2数式を行にコピーする3:4096

これにより、最初の列に最下位ビットを持つすべてのバイナリ文字列が順番に生成されます。最後の行(4096)はすべて1です。

これは依存していないためROW()(自由に移動できます)、長さを直接増やすことができ、非バイナリ文字列に一般化するのは簡単です。LibreOffice Calcでも動作します。


3

1から4096までのすべての行について、AからLまでの各セルに次の数式を入力します

=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(右から1番目のビット)は2 1-1 = 1ビットごとに交互になります。 2番目のビットは2 2-1 = 2ビットごとに切り替わります...

結果として、2 nを法として、サイクル内の数値の現在位置を取得します。2n -1未満の場合はゼロビット、それ以外の場合は1です。


1

探しているのは12桁の2進数ごとなので、0〜4095(2 ^ 12-1)のすべての数値で「DEC2BIN」関数を使用するのが最善の策です。残念ながら、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を超えてカウントし続けるようにします。

10進数から2進数への変換とビットシフトを検索して、これがどのように機能するかを理解してください。


1
@Herbの答えと比較して、「ゴルフをコード化する」(短いテキストを作成する)素晴らしい仕事ですが、彼はより柔軟なROW()を使用するA1をハードコードしているようです。なぜ彼は511まで機能すると言っているのに255と言っているのでしょうか。
TOOGAM

代わりに、ROUNDDOWN(A1/256,0)単に使用するQUOTIENT(A1, 256)か、さらに良いことができますBITRSHIFT(A1, 8)。後半にも置き換えることができるBITANDMOD
phuclv

-1

Excelの外部にデータを作成しますが、Excelでテーブルを取得するために開くことができる.csvを作成する回答。

これはpythonを使用しますが、シェル言語でも実行できます。pythonがインストールされている場合は、cmd.exeで実行します。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.