วิธีสร้างตารางที่มีการรวมกันของ 0 และ 1


15

ใน Excel ฉันต้องสร้างตารางที่มีการรวมกันทั้งหมดของ 1 และ 0 สำหรับ 12 ช่องว่าง

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 รุ่นใด
MátéJuhász


1
เขาสามารถแบ่งเลขฐานสองเป็นส่วนที่สูงและต่ำจากนั้นใช้ Concatenate เพื่อต่อสองส่วนเข้าด้วยกัน
ฉันพูดว่า Reinstate Monica

8
จากการเป็นตัวแทนของผลลัพธ์ที่ต้องการฉันจะเอามันว่าแต่ละหลักควรอยู่ในเซลล์ที่แยกจากกันและไม่ได้อยู่ในสายเดียว?
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 บิตส่วนและคำนวณสองสตริงแยกกันจากนั้นเชื่อมเข้าด้วยกัน

ดังนั้นคุณมี:

=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 ต้องการ 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- F11เปิดหน้าต่าง VBE ขึ้นมา
  2. Alt- I, Alt- Mเปิดโมดูลใหม่
  3. วางสิ่งต่างๆลงในและปิดหน้าต่าง VBE

หากคุณบันทึกเวิร์กบุ๊ก UDF จะถูกบันทึกไว้ หากคุณกำลังใช้ Excel รุ่นหนึ่งในภายหลังจากนั้นคุณต้องบันทึกไฟล์เป็น. xlsm แทนที่จะเป็น. xlsx

ในการลบ UDF:

  1. เปิดหน้าต่าง VBE ขึ้นด้านบน
  2. ล้างรหัสออก
  3. ปิดหน้าต่าง VBE

วิธีใช้ UDF จาก Excel:

=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 ()
Gary's Student

ฉันเพิ่งอ่านมาโครและสังเกตว่ามันเกินความจริง - คุณสามารถวางสูตรลงในกล่องได้โดยตรงจากนั้นใช้ฟังก์ชันการคลิก / ลากของ Excel เพื่อเปลี่ยนการอ้างอิงเซลล์ทั้งหมดหรือ - ยังดีกว่าเพียงแค่ใช้ROW() - 1แทนเซลล์ การอ้างอิง ในไฟล์ที่มีมาโครก็ทำได้ดี แต่ในที่เดียวที่ไม่มีมันจะสร้างป๊อปอัปที่น่ารำคาญและดูน่ากลัว
wizzwizz4

1
@ wizzwizz4 ฉันใช้UDFนี้เพราะฉันมีอยู่ในกล่องเครื่องมือ VBA แล้ว
Gary's Student

3

อีกวิธีที่ฉันใช้:

  • เติมจากA1เป็นL1ศูนย์
  • ในการA2เขียน=1-A1
  • ในการB2เขียน=IF( AND( A1=1, A2=0), 1-B1, B1)
  • คัดลอกB2สูตรไปที่C2:L2
  • คัดลอกA2:L2สูตรแถวไปยังแถว3:4096

สิ่งนี้สร้างสตริงไบนารีทั้งหมดตามลำดับโดยมีบิตที่สำคัญน้อยที่สุดในคอลัมน์แรก แถวสุดท้าย (4096) คือแถวทั้งหมด

สิ่งนี้ไม่ได้พึ่งพาROW()(ดังนั้นจึงสามารถเคลื่อนย้ายได้อย่างอิสระ) คุณสามารถเพิ่มความยาวได้โดยตรงและตรงไปตรงมาเพื่อทำให้เป็นสตริงที่ไม่ใช่ไบนารี นอกจากนี้ยังทำงานกับ LibreOffice Calc


3

วางสูตรต่อไปนี้ในแต่ละเซลล์จาก A ถึง L สำหรับทุกแถวจาก 1 ถึง 4096

=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 (บิตแรกจากด้านขวา) จะสลับกันทุก 2 1-1 = 1 บิต บิตที่สองจะสลับทุก 2 2-1 = 2 บิต ...

ด้วยเหตุนี้เราจะใช้โมดูโล 2 nเพื่อรับตำแหน่งปัจจุบันของตัวเลขในวงรอบหากน้อยกว่า 2 n-1มันเป็นศูนย์บิตมิฉะนั้นจะเป็นหนึ่ง


1

เนื่องจากสิ่งที่คุณต้องการคือเลขฐานสองทุก 12 หลักทางออกที่ดีที่สุดของคุณคือใช้ฟังก์ชัน "DEC2BIN" ในทุกหมายเลขตั้งแต่ 0 ถึง 4095 (2 ^ 12-1) น่าเสียดายที่ 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

ค้นหาทศนิยมเพื่อการแปลงแบบไบนารีและการเลื่อนบิตเพื่อทำความเข้าใจวิธีการทำงาน


1
ดีมาก "code golfing" (การสร้างข้อความสั้นกว่า) เทียบกับ @Herb คำตอบแม้ว่ามันจะดูเหมือนว่าคุณยากรหัส A1 ที่เขาใช้ ROW ที่ยืดหยุ่นมากขึ้น () ทำไมเขาถึงบอกว่ามันใช้งานได้ถึง 511 แต่คุณบอกว่า 255. คุณเป็นคนหนึ่งหรือเป็นความแตกต่างใน Excel เวอร์ชันที่แตกต่างกันหรือไม่?
TOOGAM

แทนที่จะเป็นROUNDDOWN(A1/256,0)คุณสามารถใช้QUOTIENT(A1, 256)หรือดีกว่าBITRSHIFT(A1, 8)นั้นได้ ส่วนหลังสามารถแทนที่ด้วยBITANDหรือMOD
phuclv

-1

คำตอบที่สร้างข้อมูลนอก excel แต่สร้าง. csv ที่สามารถเปิดเพื่อรับตารางใน excel

สิ่งนี้ใช้ python แต่สามารถทำได้ในภาษาของเชลล์เช่นกัน เพียงรันใน cmd.exe หากติดตั้ง python

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 ฉันต้องสร้าง ... " นี่ไม่ใช่ใน excel การนำเข้า CSV และคัดลอกเซลล์ไปยังสถานที่ที่เหมาะสมได้ตลอดเวลาที่คุณต้องการแก้ไข (เช่นแถวมากขึ้น / น้อยลง) อาจเป็นความเจ็บปวด
Tom Carpenter

นี่สำหรับ Python <3 แต่> = 2.3 สำหรับความเข้ากันได้ต่อไปโปรดเพิ่มวงเล็บเหลี่ยมเพื่อให้printคำหลักนั้นเรียกว่าฟังก์ชั่น - ด้วยวิธีนี้จะเข้ากันได้กับ Python 2.3+ และ Python 3.0.0+
wizzwizz4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.