แม้ว่าคำตอบที่ได้รับการยอมรับชี้ให้เห็นว่า endianess เป็นแนวคิดจากมุมมองหน่วยความจำ แต่ฉันไม่คิดว่าจะตอบคำถามโดยตรง
คำตอบบางคำบอกฉันว่าการทำงานระดับบิตไม่ได้ขึ้นอยู่กับ endianessและโปรเซสเซอร์อาจเป็นตัวแทนของไบต์ด้วยวิธีอื่น อย่างไรก็ตามมันกำลังพูดถึง endianess นั้นถูกทำให้เป็นนามธรรม
แต่เมื่อเราทำการคำนวณระดับบิตบนกระดาษไม่จำเป็นต้องระบุจุดสิ้นสุดในตอนแรก? เวลาส่วนใหญ่เราเลือก endianess โดยปริยาย
ตัวอย่างเช่นสมมติว่าเรามีบรรทัดของรหัสเช่นนี้
0x1F & 0xEF
คุณจะคำนวณผลลัพธ์ด้วยมือลงบนกระดาษได้อย่างไร
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
ดังนั้นที่นี่เราใช้รูปแบบ Big Endian ทำการคำนวณ คุณสามารถใช้ Little Endian เพื่อคำนวณและรับผลลัพธ์เดียวกันได้
Btw เมื่อเราเขียนตัวเลขในรหัสฉันคิดว่ามันเป็นรูปแบบ Big Endian 123456
หรือ0x1F
ตัวเลขที่สำคัญที่สุดเริ่มจากด้านซ้าย
อีกครั้งทันทีที่เราเขียนรูปแบบไบนารีของค่าลงบนกระดาษฉันคิดว่าเราได้เลือก Endianess แล้วและเรากำลังดูค่าตามที่เราเห็นจากหน่วยความจำ
ดังนั้นกลับไปที่คำถามที่การดำเนินการเปลี่ยนแปลง<<
ควรจะคิดเป็นขยับจาก LSB (ไบต์ที่สำคัญน้อยที่สุด) เพื่อ MSB (ส่วนใหญ่ไบต์ที่สำคัญ)
จากนั้นเป็นตัวอย่างในคำถาม:
numb=1025
Endian น้อย
LSB 00000001 00000100 00000000 00000000 MSB
ดังนั้น<< 10
จะ10bit
เปลี่ยนจาก LSB เป็น MSB
การเปรียบเทียบและ<< 10
การดำเนินการสำหรับรูปแบบ Little Endian ทีละขั้นตอน:
MSB LSB
00000000 00000000 00000100 00000001 numb(1025)
00000000 00010000 00000100 00000000 << 10
LSB MSB
00000000 00000100 00010000 00000000 numb(1025) << 10, and put in a Little Endian Format
LSB MSB
00000001 00000100 00000000 00000000 numb(1205) in Little Endian format
00000010 00001000 00000000 00000000 << 1
00000100 00010000 00000000 00000000 << 2
00001000 00100000 00000000 00000000 << 3
00010000 01000000 00000000 00000000 << 4
00100000 10000000 00000000 00000000 << 5
01000000 00000000 00000001 00000000 << 6
10000000 00000000 00000010 00000000 << 7
00000000 00000001 00000100 00000000 << 8
00000000 00000010 00001000 00000000 << 9
00000000 00000100 00010000 00000000 << 10 (check this final result!)
ว้าว! ฉันได้รับผลลัพธ์ที่คาดหวังตามคำอธิบายของ OP!
ปัญหาที่ OP ไม่ได้รับตามที่คาดไว้คือ:
ดูเหมือนว่าเขาไม่ได้เปลี่ยนจาก LSB เป็น MSB
เมื่อขยับบิตในรูปแบบ Little Endian คุณควรตระหนัก (ขอบคุณพระเจ้าที่ฉันรู้) ว่า:
LSB 10000000 00000000 MSB << 1
คือ
LSB 00000000 00000001 MSB
, ไม่
LSB 01000000 00000000 MSB
เพราะสำหรับแต่ละคน8bits
เรากำลังเขียนมันในMSB 00000000 LSB
รูปแบบ Big Endian
มันก็เหมือนกัน
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
เพื่อสรุป:
แม้ว่าการดำเนินการระดับบิตจะกล่าวได้ว่าเป็นนามธรรมที่ถูกตัดออก blablablabla ... เมื่อเราคำนวณการดำเนินงานระดับบิตด้วยมือเรายังคงต้องรู้ว่าเราใช้ endianess อะไรในขณะที่เราเขียนรูปแบบไบนารีลงบนกระดาษ นอกจากนี้เรายังต้องตรวจสอบให้แน่ใจว่าผู้ให้บริการทุกรายใช้ปลายทางเดียวกัน
OP ไม่ได้รับผลลัพธ์ตามที่คาดไว้เพราะเขาทำผิดพลาด