Đặ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ư NumOfBits
và 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.