Cách tạo bảng với tất cả các kết hợp 0 ​​và 1


15

Trong Excel, tôi cần tạo một bảng có tất cả các kết hợp 1 và 0 cho 12 khoảng trắng.

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

và v.v., nhận được tất cả các kết hợp như

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

Tôi có thể làm cái này như thế nào?


bạn sử dụng phiên bản Excel nào?
Máté Juhász


1
Anh ta có thể chia số nhị phân thành một phần có thứ tự cao và thứ tự thấp, sau đó sử dụng Concatenate để ghép hai phần lại với nhau.
Tôi nói Phục hồi lại

8
Từ sự thể hiện của bạn về đầu ra mong muốn, tôi có nhận thấy rằng mỗi chữ số phải nằm trong một ô riêng biệt và không nằm trong một chuỗi không?
Baldrickk

4
Để tham khảo trong tương lai, cách cảm ơn mọi người trên Stack Exchange là sử dụng nút đó. Để biết câu trả lời phù hợp với bạn (và đưa ra kết quả đúng), hãy sử dụng nút ✔ đó. Nếu có nhiều câu trả lời hoạt động, hãy chọn câu trả lời bạn thích nhất.
wizzwizz4

Câu trả lời:


27

Vì 2 ^ 12 = 4096, bạn cần 4096 ô (12 cho 12 bit của bạn).

Về nguyên tắc, bạn đưa vào A1 đến A4096 lệnh này:

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

Đó sẽ là nó, nhưng nó chỉ hoạt động với 0 ... 511 (9 bit). Vì vậy, chúng tôi áp dụng một mẹo: chúng tôi chia số thành 3 bit và một phần 9 bit và tính hai chuỗi riêng biệt, sau đó nối chúng lại.

Do đó bạn có:

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

Chỉnh sửa: Tôi không nhận thức được số lượng đối số tùy chọn. Sử dụng nó sẽ cung cấp cho chức năng này:

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

Đặt cái này vào các ô A1 đến A4096.

Chỉnh sửa 2: Theo nhận xét của Lưu Vĩnh Phúc, có thể OP muốn 12 cột với mỗi chữ số nhị phân. Trong trường hợp này, đặt

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

vào tất cả các ô từ A1 đến L 4096.


23

Chỉ cần sao chép-dán công thức sau vào bên trong A1:

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

Sau đó kéo-điền lên đến L4096.

Ảnh chụp màn hình

Công thức trích xuất bit thứ n của một số (n> = 0): số đó là số nguyên chia cho 2 ^ n, sau đó tính mô đun 2.


9

Trước tiên, hãy nhập Hàm do người dùng xác định sau trong mô-đun chuẩn:

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

Điều này trả về một chuỗi 36 "bit". Sau đó trong A1 nhập:

=ROW()-1

và sao chép xuống qua A4096

Trong B1 nhập:

=RIGHT(bigbinary(A1),12)

và sao chép xuống qua B4096 :

bản giới thiệu

Hàm do người dùng xác định (UDF) rất dễ cài đặt và sử dụng:

  1. Alt-F11 hiển thị cửa sổ VBE
  2. Alt- I,Alt - Mmở một mô-đun mới
  3. dán nội dung vào và đóng cửa sổ VBE

Nếu bạn lưu sổ làm việc, UDF sẽ được lưu cùng với nó. Nếu bạn đang sử dụng phiên bản Excel sau đó sau 2003, bạn phải lưu tệp dưới dạng .xlsm chứ không phải .xlsx

Để xóa UDF:

  1. đưa lên cửa sổ VBE như trên
  2. xóa mã ra
  3. đóng cửa sổ VBE

Để sử dụng UDF từ Excel:

=myfunction(A1)

Để tìm hiểu thêm về macro nói chung, xem:

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

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

và để biết chi tiết về UDF, xem:

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

Macro phải được kích hoạt để làm việc này!


Chắc chắn người ta chỉ có thể sử dụng =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4

@ wizzwizz4 Bạn đã đúng ... với một chút thay đổi đối với UDF ()
Sinh viên của Gary

Tôi vừa đọc macro và nhận thấy rằng nó quá mức cần thiết - bạn chỉ có thể dán công thức trực tiếp vào hộp sau đó sử dụng chức năng nhấp / kéo của Excel để thay đổi tất cả các tham chiếu ô hoặc - tốt hơn là chỉ sử dụng ROW() - 1thay vì một ô tài liệu tham khảo. Trong một tệp có macro thì không sao, nhưng trong một tệp không có nó sẽ tạo ra một cửa sổ bật lên trông khó chịu và đáng sợ.
wizzwizz4

1
@ wizzwizz4 Tôi đã sử dụng UDF () này vì tôi đã có nó trong hộp công cụ VBA của mình
Sinh viên của Gary

3

Một cách khác tôi đã sử dụng:

  • Điền từ A1đến L1với số không
  • trong A2ghi=1-A1
  • trong B2ghi=IF( AND( A1=1, A2=0), 1-B1, B1)
  • Sao chép B2công thức vàoC2:L2
  • Sao chép A2:L2công thức hàng vào hàng3:4096

Điều này tạo ra tất cả các chuỗi nhị phân theo thứ tự, với các bit quan trọng nhất trên cột đầu tiên. Hàng cuối cùng (4096) là tất cả những người.

Điều này không phụ thuộc vào ROW()(vì vậy nó có thể được di chuyển tự do), bạn có thể tăng chiều dài trực tiếp và rất khó để khái quát hóa các chuỗi không nhị phân. Nó cũng hoạt động với LibreScript Calc.


3

Đặt công thức sau vào mỗi ô từ A đến L, cho tất cả các hàng từ 1 đến 4096

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

Nếu bạn muốn toàn bộ thứ trong một chuỗi có khoảng trắng như những gì bạn đã hỏi, hãy đặt cái này vào cột cuối cùng

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

Sau đó kéo các hàng cho đến khi M4096

Để có giải pháp tổng quát hơn, hãy đặt số bit trong một số ô, như Z1 hoặc ô được đặt tên như NumOfBitsvà sử dụng công thức sau

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

Cũng có thể dễ dàng sửa đổi để sử dụng bất kỳ ô nào làm ô bắt đầu bằng cách thay đổi bù hàng và cột

Phiên bản được tối ưu hóa bằng cách sử dụng các thao tác bitwise thay vì quyền hạn:

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

Cách nhanh nhất:

  • Sao chép một trong các công thức trên
  • Nhấn F5(hoặc Ctrl+ G) và nhập A1: L4096 để chọn toàn bộ phạm vi
  • Nhấn F2rồi Ctrl+ Vđể dán
  • Nhấn Ctrl+ Shift+ Enter. Bùng nổ. Bạn đã hoàn tất. Không cần phải kéo

Đây là một công thức mảng nhanh hơn nhiều để tính toán và tạo ra một tệp nhỏ hơn nhiều


Giải trình:

Nếu chúng ta viết tất cả các biểu diễn nhị phân theo các hàng từ trên xuống dưới, chu kỳ lật / bật của bit thứ n (tính từ lsb) là 2 n . Trong mỗi chu kỳ, nửa đầu (từ 0 đến 2 n-1 -1) sẽ là 0 và nửa cuối sẽ là 1. Ví dụ: lsb (bit đầu tiên từ bên phải) sẽ thay thế cứ sau 2 1-1 = 1 bit, bit thứ hai sẽ chuyển đổi cứ sau 2 2-1 = 2 bit ...

Do đó, chúng tôi sẽ sử dụng modulo 2 n để có được vị trí hiện tại của số trong chu kỳ, nếu nó nhỏ hơn 2 n-1 thì đó là một bit 0, nếu không thì đó là một.


1

Vì những gì bạn đang tìm kiếm là mỗi số nhị phân 12 chữ số, đặt cược tốt nhất của bạn là sử dụng chức năng "DEC2BIN" trên mỗi số từ 0 đến 4095 (2 ^ 12-1). Thật không may, DEC2BIN chỉ hoạt động tối đa 8 chữ số nên công thức cuối cùng có vẻ hơi phức tạp vì nó được ghép nối:

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

DEC2BIN lấy số để chuyển đổi và số chữ số bạn muốn xuất. Tôi đã kết hợp 4 và 8 để có được 12. Để dịch chuyển 4 chữ số đầu tiên lên giá trị cao nhất tôi chia cho 256 (2 ^ 8) và làm tròn xuống để bỏ qua các chữ số có giá trị thấp hơn khác. Đối với các chữ số giá trị thấp hơn trừ đi giá trị này để chúng sẽ tiếp tục đếm quá 255.

Tìm kiếm chuyển đổi thập phân sang nhị phân và dịch chuyển bit để hiểu cách thức hoạt động của nó.


1
Công việc tuyệt vời "chơi golf mã" (tạo văn bản ngắn hơn) so với câu trả lời của @Herb, mặc dù có vẻ như bạn khó mã A1 khi anh ấy sử dụng ROW () linh hoạt hơn. Tại sao anh ta nói nó hoạt động đến 511 nhưng bạn nói 255. Là một trong số các bạn tắt, hay nó là một sự khác biệt trong các phiên bản Excel khác nhau?
TẤT CẢ

thay vì ROUNDDOWN(A1/256,0)bạn chỉ có thể sử dụng QUOTIENT(A1, 256), hoặc thậm chí tốt hơn BITRSHIFT(A1, 8). Phần sau cũng có thể được thay thế bằng BITANDhoặcMOD
phuclv

-1

Một câu trả lời tạo ra dữ liệu bên ngoài excel, nhưng tạo một .csv có thể được mở để lấy bảng trong excel.

Điều này sử dụng python, nhưng cũng có thể được thực hiện bằng ngôn ngữ shell. Chỉ cần chạy nó trong cmd.exe nếu python được cài đặt.

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

Điều này tạo ra một tệp (binary.csv) có chứa nội dung mong muốn, mỗi chữ số trong các ô riêng biệt như (tôi nghĩ) được mong muốn từ câu hỏi.

giải trình:

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
Tôi không phải là người bỏ phiếu, nhưng "Trong Excel, tôi cần tạo ...". Đây không phải là trong excel. Nhập CSV và sao chép các ô vào đúng nơi bất cứ lúc nào bạn muốn sửa đổi nó (ví dụ: nhiều hơn / ít hàng hơn) sẽ là một điều khó khăn.
Tom Carpenter

Đây là cho Python <3 nhưng> = 2.3. Để tương thích về phía trước, vui lòng thêm dấu ngoặc để printtừ khóa được gọi giống như một hàm - theo cách đó nó sẽ tương thích với Python 2.3+ và Python 3.0.0+
wizzwizz4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.