การจัดการบิตสำหรับคลาสจำนวนเต็มขนาดใหญ่?

ฉันมีปัญหาในการหาอัลกอริทึมสำหรับคลาสจำนวนเต็มขนาดใหญ่ใน C ++ ความคิดเริ่มแรกของฉันคือการใช้อาร์เรย์/รายการ แต่มันก็ไม่มีประสิทธิภาพมาก จากนั้นฉันก็ค้นพบสิ่งต่าง ๆ เช่นคลาสต่อไปนี้: http://www.codeproject.com/KB/cpp/CppIntegerClass.aspx

อย่างไรก็ตาม ฉันพบว่าแนวทางดังกล่าวน่าสับสนมาก ฉันไม่รู้วิธีทำงานกับการปรับแต่งเล็กน้อย และฉันแทบจะไม่เข้าใจโค้ดเลย ใครก็ได้ช่วยอธิบายวิธีใช้การยักย้ายบิต วิธีการทำงาน ฯลฯ ให้ฉันฟังหน่อยสิ ในที่สุดฉันก็อยากจะสร้างคลาสจำนวนเต็มขนาดใหญ่ของตัวเอง แต่ฉันเพิ่งจะเป็นโปรแกรมเมอร์มือใหม่และฉันเพิ่งเรียนรู้วิธีใช้คลาส

โดยพื้นฐานแล้วคำถามของฉันคือ: ฉันจะใช้การจัดการบิตเพื่อสร้างคลาสจำนวนเต็มขนาดใหญ่ได้อย่างไร มันทำงานยังไง??

ขอบคุณ!


person Lockhead    schedule 13.12.2010    source แหล่งที่มา


คำตอบ (1)


เริ่มต้นด้วยการอ่าน เลขฐานสอง โดยทั่วไป หน้านั้นจะแสดงวิธีการทำงานของการคำนวณทางคณิตศาสตร์ทั่วไป (การบวก การลบ ฯลฯ) กับเลขฐานสอง กล่าวคือ วิธีจัดการตัวเลขทีละนิดเพื่อให้ได้ผลลัพธ์ที่ต้องการ

การแม็พเป็นภาษาการเขียนโปรแกรมเช่น C++ ควรจะตรงไปตรงมาเมื่อคุณรู้ว่าทำไมจึงมีการใช้งานการประมวลผลบิต

จากประสบการณ์ของผม สิ่งที่เน้นบิตที่ชัดเจนที่สุดที่จำเป็นเมื่อใช้งานบางอย่างเช่นนี้คือ การทดสอบ บิต เพื่อตรวจสอบโอเวอร์โฟลว์ สมมติว่าคุณแทนเลขฐานสองขนาดใหญ่ของคุณเป็นอาร์เรย์ uint16_t เช่น ชิ้นขนาด 16 บิต เมื่อทำการบวก คุณจะเริ่มต้นที่จุดสิ้นสุดที่มีนัยสำคัญน้อยที่สุดของทั้งสองตัวเลข แล้วบวกเข้าด้วยกัน หากผลรวมมากกว่า 65,535 คุณต้อง "ยก" หนึ่งไปยัง uint16_t ถัดไป เช่นเดียวกับเมื่อคุณบวกเลขทศนิยมทีละหลัก

สิ่งนี้สามารถนำไปใช้ได้ด้วยการทดสอบดังนี้:

const uint16_t *number1;
const uint16_t *number2;

/* assume code goes here to set up the number1 and number2 pointers. */

/* Compute sum of 16 bits. */
uint16_t carry = 0;
uint32_t sum = number1[0] + number2[0];

/* One way of testing for overflow: */
if (sum & (1 << 16))
 carry = 1;

ในที่นี้ นิพจน์ 1 << 16 จะสร้างมาสก์โดยเลื่อน 1 ขั้นไปทางซ้าย 16 ขั้น & ระดับบิตและตัวดำเนินการจะทดสอบผลรวมเทียบกับมาสก์ ผลลัพธ์จะไม่เป็นศูนย์ (เช่น จริง ในภาษา C++) หากตั้งค่าบิต 16 ใน sum

person unwind    schedule 13.12.2010
comment
แต่ผลลัพธ์จะไม่ใหญ่เกินไปสำหรับประเภทข้อมูลมาตรฐานใดๆ ใช่หรือไม่ ฉันจะจัดการกับสิ่งนั้นได้อย่างไร? - person Lockhead; 13.12.2010