การเลื่อนบิตและจัดการระดับบิตด้วยเลขทศนิยม
แนะนำใหม่| English | ความหมาย |
|---|---|
| bit/bɪt/ | บิต |
| mask/mæsk/ | มาสก์ |
| logical shift/ˈlɒdʒɪkl ʃɪft/ | การเลื่อนตรรกะ |
| sign bit/saɪn bɪt/ | บิตเครื่องหมาย |
| arithmetic right shift/ˌærɪθˈmetɪk raɪt ʃɪft/ | การเลื่อนทางขวาแบบเลขคณิต |
| cyclic shift/ˈsaɪklɪk ʃɪft/ | การเลื่อนแบบหมุนวน |
การคูณบนชิปที่ไม่สามารถคูณได้
- โปรเซสเซอร์ใน Game Boy ปี 1989 ไม่มีคำสั่งคูณเลย คะแนนทุกคะแนน พิกัดทุกจุดที่ต้องการการคูณด้วยสอง จะถูกคูณสองโดยการเลื่อนบิตไปทางซ้ายหนึ่งตำแหน่ง
- การเลื่อนหนึ่งครั้งใช้เวลาหนึ่งนาฬิกาสัญญาณ การคูณที่สร้างจากการเลื่อนและการบวกคือวิธีที่เกมเหล่านั้นทำงานบนหน่วยความจำไม่กี่กิโลไบต์และกำลังไฟไม่กี่มิลลิวัตต์
- เทคนิคเดียวกันควบคุมสายเดี่ยวในอุปกรณ์ฝังตัว: บิตหนึ่งของรีจิสเตอร์ต่อเซ็นเซอร์หรือ actuator, ทดสอบและตั้งค่าด้วย มาสก์
- บทเรียนนี้คือสามประเภทของการเลื่อนและสี่การดำเนินการของมาสก์, ในคำแนะนำของการสอบเอง
การเลื่อนตรรกะ
- การเลื่อนตรรกะ ย้ายทุกบิตไปทางซ้ายหรือขวาจำนวนตำแหน่งหนึ่งๆ และเติมตำแหน่งที่ว่างเปล่าด้วย 0.
LSL #1เลื่อนบิตไปทางซ้ายและมี 0 เข้ามาทางขวา: สำหรับเลขที่ไม่มีเครื่องหมาย นั่นคือ × 2.LSR #1เลื่อนไปทางขวาและมี 0 เข้ามาทางซ้าย: จำนวนเต็ม ÷ 2.- การเลื่อน $n$ ตำแหน่งคูณหรือหารด้วย $2^{n}$.
00001011(11) หลังLSL #1คือ00010110(22); หลังLSR #1คือ00000101(5, ส่วนเหลือหายไปได้)

การเลื่อนทางซ้าย (× 2), การเลื่อนทางขวา (÷ 2) และการเลื่อนทางขวาเชิงคำนวณ (รักษาบิตเครื่องหมาย)
เลื่อนและบดบิตของไบต์
เลือกตัวดำเนินการและดูผลลัพธ์ของแต่ละบิต การเลื่อนซ้าย (<<) moves every bit up one place (×2); a right shift (>>) จะย้ายลง (÷2); AND กับมาส์กจะลบบิตที่ไม่ต้องการออก
ค่า 8-บิต 00001011 (11) เลื่อนซ้าย 1 ตำแหน่ง (LSL #1) ค่าทศนิยมใหม่คืออะไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
การเลื่อนซ้าย 1 ตำแหน่งคูณด้วย 2: $11 \times 2 = 22$ (00010110)
การเลื่อนตัวเลขไม่มีเครื่องหมาย向左 3 ตำแหน่ง คูณด้วยจำนวนใด?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
การเลื่อน $n$ ตำแหน่ง คูณด้วย $2^n$ ดังนั้นเลื่อน 3 ตำแหน่ง คือ $2^3 = 8$
ตัวอย่างแสดงวิธีทำ: เมื่อ × 4不再ถูกต้อง
- บิตที่ถูกเลื่อนออกจากปลายจะหายไป ดังนั้นการคูณจะถูกต้องเฉพาะขณะที่บิตเหล่านั้นเป็นศูนย์
- การ
LSL #2บนไต่บิต complement11001010ให้ผลลัพธ์00101000. ตัว 1 สองตัวที่หลุดออกทางซ้ายหายไป, บิตเครื่องหมายเปลี่ยนไป, และผลลัพธ์不再是 cuatro เท่าของค่าเดิม. - การ
LSL #2บน00001011(11) ให้ผลลัพธ์00101100(44), ซึ่งถูกต้อง, เพราะมีเพียงเลขศูนย์ที่หายไปเท่านั้น - การสอบถามทั้งสองอย่าง: รูปแบบหลังเลื่อน, และความคิดเห็นว่าค่านั้นยังถูกต้องหรือไม่
การเลื่อนทางขวาเชิงคำนวณ
- การเลื่อนทางขวาตรรกะธรรมดาจะใส่ 0 ที่บิตบนสุด, ซึ่งจะเปลี่ยนเลข complement ที่ติดลบให้เป็นเลขบวก
- การเลื่อนทางขวาเชิงคำนวณ คัดลอก บิตเครื่องหมาย เข้าไปในทุกตำแหน่งที่ว่างเปล่า, เพื่อให้เลขติดลบยังคงติดลบและการเลื่อนยังคงหารด้วย 2
10011110เลื่อนทางขวาเชิงคำนวณ 3 ตำแหน่งจะได้11110011;01011100ให้ผลลัพธ์00001011.

การเลื่อนทางขวาแบบตรรกะและเชิงคำนวณบนไต่บิตเดียวกัน: เพียงบิตที่เข้ามาต่าง nhauเท่านั้น
การเลื่อนขวาเชิงเลขคณิตต่างจากการเลื่อนขวาเชิงตรรกะเพราะมัน:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
รักษาบิตสัญญาณไว้ ทำให้การหารเลขมีเครื่องหมายลบด้วยกำลังของ 2 ยังคงให้ผลลัพธ์เป็นลบ
การเลื่อนขวาเชิงตรรกะจะใส่ 0 ในบิตบนเสมอ จึงสามารถเปลี่ยนเลขมีเครื่องหมายลบให้เป็นบวกได้
Difficulty 1/5 · 100 coins + a small bonus on first completion today
นั่นคือเหตุผลที่การหารเลขมีเครื่องหมายต้องใช้ การเลื่อนขวาเชิงเลขคณิต ซึ่งคัดลอกบิตสัญญาณแทน
การเลื่อนขวาเชิงเลขคณิตของ 10011110 จำนวน 3 ตำแหน่ง ให้รูปแบบ 8-บิต ____
Difficulty 1/5 · 100 coins + a small bonus on first completion today
สามตำแหน่งว่างด้านซ้ายจะถูกเติมด้วยการคัดลอกบิตสัญญาณ 1 และสามบิตทางขวาสุด 110 จะหลุดหายไป
การหมุนเวียน
- การหมุนเวียน, หรือ rotate, นำบิตที่ตกลงออกจากด้านหนึ่งกลับเข้าไปที่อีกด้านหนึ่ง, ดังนั้นไม่มีบิต nàoหายไป
- การเลื่อนทางซ้ายหมุนเวียน 1 ครั้งบน
10000110ให้ผลลัพธ์00001101: ตัว 1 ด้านหน้าปรากฏขึ้นทางขวาอีกครั้ง - การเลื่อนตรรกะ (Logical shifts) จะเติมด้วยศูนย์, การเลื่อนทางคณิตศาสตร์ (Arithmetic shifts) เติมด้วยบิตเครื่องหมาย, การเลื่อนวงกลม (Cyclic shifts) เติมด้วยบิตที่ออกข้างไป นั่นคือความแตกต่างทั้งหมดระหว่างทั้งสาม
การเลื่อนซ้ายแบบหมุนรอบวง 1 ตำแหน่ง ถูกนำไปใช้กับ 10000110 ผลลัพธ์คืออะไร?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
1 ตัวแรกทางซ้ายออกและกลับเข้ามาทางขวา ไม่มีบิตไหนหายไป 00001100 จะเป็นผลของการเลื่อนเชิงตรรกะ
ตัวอย่างแสดงวิธีทำ: 240 หรือลบ 16?
- Take
11110000. อ่านเป็นเลขที่ไม่มีเครื่องหมายคือ 240; อ่านเป็น complement คือ −16. LSR #1นำ 0 เข้ามาและให้ผลลัพธ์01111000= 120, ครึ่งที่ถูกต้องของ 240.ASR #1คัดลอกบิตเครื่องหมายและให้ผลลัพธ์11111000= −8, ครึ่งที่ถูกต้องของ −16.- ไม่มีอะไรผิด. แต่ละวิธีแบ่งครึ่งค่าภายใต้การอ่านหนึ่งแบบ, นั่นคือเหตุผลที่โปรเซสเซอร์ต้องมีความournamentทั้งสอง
ข้อใดถูกต้องเกี่ยวกับไบต์ 11110000? เลือก ทุก ข้อที่ใช้ได้
Difficulty 2/5 · 140 coins + a small bonus on first completion today
ผลลัพธ์ทั้งสองต่างกันเฉพาะบิตที่เข้าสู่ทางซ้าย: 0 สำหรับการเลื่อนเชิงตรรกะ, บิตสัญญาณสำหรับการเลื่อนเชิงเลขคณิต
การ masked บิต
- อุปกรณ์ฝังตัวมักใช้ bait เดียวของรีจิสเตอร์ต่อสัญญาณหนึ่ง. Mask คือรูปแบบที่ถูกนำมารวมกับรีจิสเตอร์เพื่อให้เพียงบิตที่เลือกจะเปลี่ยนแปลง
- Set bit $n$:
ORกับ mask ที่มี 1 ที่ตำแหน่ง $n$. Clear bit $n$:ANDกับ mask ที่มี 0 ที่นั่นและมี 1 ทุกที่อื่น. - Toggle bit $n$:
XORกับ mask ที่มี 1 ที่นั่น. Test bit $n$:ANDกับ mask นั้น, แล้วCMP #0: ไม่เท่ากันหมายถึงบิตนั้นถูก set ไว้แล้ว

ใช้ OR เพื่อตั้ง, ใช้ AND เพื่อล้าง, ใช้ XOR เพื่อสลับสถานะ โดยแต่ละอย่างใช้ mask ที่แตกต่างกัน
จับคู่แต่ละการดำเนินการระดับบิตกับตัวดำเนินการระดับบิต (และมาส์ก) ที่ทำสิ่งนั้น
Difficulty 2/5 · 140 coins + a small bonus on first completion today
OR ตั้งค่า, AND ลบ, XOR สลับ, และ AND + การทดสอบว่าไม่ใช่ศูนย์ อ่านค่าบิต — สี่ขั้นตอนการจัดการมาส์ก
เพื่อ SET บิต tertentuให้เป็น 1 คุณต้องรวมรีจิสเตอร์เข้ากับมาส์กโดยใช้:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
OR กับมาส์กที่มีบิตนั้น = 1 บังคับให้บิตนั้นเป็น 1 และ giữบิตอื่นๆ ไว้เดิม
ตัวอย่างวิธีทำ: คำสั่งบนบิตหนึ่ง字节
- ACC เก็บค่า
10101100. mask สามารถเขียนเป็น#nเป็นเลขฐานสิบ,Bnเป็นเลขฐานสอง หรือ&nเป็นเลขฐานหกteenได้. AND B00001111ให้ผลลัพธ์00001100: บิตสี่ตัวล่างเพียงอย่างเดียวที่ยังคงอยู่.OR #1ให้ผลลัพธ์10101101: บิตที่มีนัยสำคัญน้อยที่สุดถูกตั้งค่าขึ้นและไม่มีอะไรเคลื่อนย้ายอื่นใด.XOR &FFให้ผลลัพธ์01010011: ทุกบิตถูกกลับด้าน. แล้วAND B00001000และCMP #0ตรวจสอบบิตที่ 3; ผลลัพธ์00001000ไม่เป็นศูนย์ ดังนั้นบิตที่ 3 ถูกตั้งค่าไว้.LSL #2ให้ผลลัพธ์10110000, ทำให้สูญเสียบิตบนสุดสองตัว;LSR #3ให้ผลลัพธ์00010101.
คำสั่งที่ตั้งบิตที่มีนัยสำคัญน้อยที่สุดของ ACC ให้เป็น 1 และคงบิตอื่นๆ ไว้เดิมคือ OR ____
Difficulty 1/5 · 100 coins + a small bonus on first completion today
OR กับมาส์กที่มี 1 เฉพาะในตำแหน่งสุดท้าย ทศนิยม #1, เบนารี B00000001 และเฮกซีdecimal &1 เป็นมาส์กเดียวกัน
เรียงลำดับขั้นตอนสำหรับการตรวจสอบว่าบิตที่ 3 ของ ACC ถูกตั้งค่าหรือไม่
Difficulty 3/5 · 200 coins + a small bonus on first completion today
มาส์ก, เปรียบเทียบ, กระโดด การ AND จะเหลือ 00001000 หรือ 00000000 และการเปรียบเทียบกับศูนย์จะบอกความแตกต่างระหว่างสองค่านี้ได้
การตรวจสอบและการควบคุม, บิตละหนึ่ง
- ในอุปกรณ์ตรวจสอบ บิตหนึ่งต่อเซนเซอร์หนึ่งหมายความว่า bitor ONE
ANDสามารถตรวจสอบได้ว่าเซนเซอร์某一个特定的是否เปิดอยู่. - ในอุปกรณ์ควบคุม bitor ONE
ORเปิดบิตควบคุมของ actuator โดยไม่รบกวนอื่นๆ, และ bitor ONEANDปิดมัน. - มันเร็ว ใช้น้อยมาก และหนึ่ง字节เก็บสถานะเปิด/ปิดอิสระได้แปดสถานะ นั่นคือเหตุผล "ทำไม" ที่ข้อสอบถามถึง.
คะแนนที่หลุดหายไป
- การเลื่อนทางซ้ายคือ × 2 ต่อตำแหน่ง เฉพาะ enquantoที่บิตที่ตกหล่นเป็นศูนย์. ต้องบอกเมื่อสูญเสีย 1.
- การเลื่อนทางขวาแบบตรรกะจะเติม 0; การเลื่อนทางขวาแบบเลขคณิตจะคัดลอกบิตเครื่องหมาย. เลือกตามว่าตัวเลขมีเครื่องหมายหรือไม่.
- ในการล้างบิต mask ต้องมี 0 ที่บิตนั้นและมี 1 ทุกที่อื่น. mask ที่เป็นศูนย์ทั้งหมดจะล้างทั้งรีจิสเตอร์.
XORสลับสถานะ; ไม่ได้ตั้ง. ในการตั้งให้ใช้OR, ในการทดสอบให้ใช้ANDและเปรียบเทียบกับศูนย์.
คุณเข้าใจแล้ว
- การเลื่อนแบบตรรกะ เติมด้วย 0: เลื่อนซ้าย × 2 ต่อตำแหน่ง, เลื่อนขวา ÷ 2, และการสูญเสีย 1 ทำลายการคำนวณทางเลขคณิต
- การเลื่อนทางขวาแบบเลขคณิต คัดลอก บิตเครื่องหมาย; การเลื่อนแบบวงกลม ล้อมรอบบิตกลับไปที่จุดเริ่มต้น
- masks: OR ตั้ง · AND ล้าง · XOR สลับ · AND แล้ว CMP #0 ทดสอบ
- บิตละหนึ่งต่อเซนเซอร์หรือ actuator ทำให้การตรวจสอบและการควบคุมรวดเร็วและเล็ก; mask เขียนเป็น
#n,Bnหรือ&n