একটি যখন signed long long int
ধরে রাখবে না A*B
, তাদের মধ্যে দুটি থাকবে। সুতরাং A*B
গাছের বিভিন্ন শর্তগুলিতে বিভিন্ন ক্ষতিকারকগুলির সাথে সংযুক্ত হতে পারে, এর মধ্যে যে কোনও একটিও মানানসই signed long long int
।
A1=A>>32;
A0=A & 0xffffffff;
B1=B>>32;
B0=B & 0xffffffff;
AB_0=A0*B0;
AB_1=A0*B1+A1*B0;
AB_2=A1*B1;
একই জন্য C*D
।
সোজা পথ অনুসরণ করে, বিয়োগ প্রতিটি জোড় AB_i
এবং CD_i
একইভাবে প্রতিটি অতিরিক্ত অতিরিক্ত বিট (সঠিকভাবে 1-বিট পূর্ণসংখ্যার) ব্যবহার করে করা যেতে পারে। সুতরাং আমরা যদি E = A * BC * D বলি তবে আপনি এর মতো কিছু পান:
E_00=AB_0-CD_0
E_01=(AB_0 > CD_0) == (AB_0 - CD_0 < 0) ? 0 : 1 // carry bit if overflow
E_10=AB_1-CD_1
...
আমরা উপরের অংশে অর্ধেক স্থানান্তর করার দ্বারা অবিরত E_10
করার E_20
(32 দ্বারা শিফ্ট ও যোগ করুন, তারপর উপরের অর্ধেক নিশ্চিহ্ন E_10
)।
এখন আপনি ক্যারি বিটটি E_11
এটিকে ডান চিহ্ন (অ বহনকারী অংশ থেকে প্রাপ্ত) দিয়ে যুক্ত করে মুক্ত করতে পারেন E_20
। যদি এটি একটি ওভারফ্লো ট্রিগার করে, ফলাফলটিও ফিট করে না।
E_10
E_00
(শিফট, যোগ, মুছুন) এবং ক্যারি বিট থেকে উপরের অর্ধেকটি নিতে এখন পর্যাপ্ত 'স্পেস' রয়েছে E_01
।
E_10
এখন আবার বড় হতে পারে, তাই আমরা স্থানান্তর পুনরাবৃত্তি E_20
।
এই মুহুর্তে, E_20
অবশ্যই শূন্য হতে হবে, অন্যথায় ফলাফল ফিট হবে না। উপরের অর্ধেকটি E_10
স্থানান্তরের ফলেও খালি রয়েছে।
চূড়ান্ত পদক্ষেপ হ'ল নীচের অর্ধেকটি আবার স্থানান্তর E_20
করা E_10
।
যদি প্রত্যাশাটি হোল্ডগুলির E=A*B+C*D
সাথে খাপ signed long long int
খায় তবে আমাদের এখন তা আছে
E_20=0
E_10=0
E_00=E