تقسيم int128_t إلى جزئي hi و lo من نوع int64_t
عند العمل مع الأعداد الكبيرة في البرمجة، يمكن أن تكون أنواع البيانات التقليدية مثل int64_t
غير كافية في بعض الحالات. لذلك، تمثل المكتبة boost::multiprecision
خيارًا فعالًا حيث توفر نوع بيانات يسمى int128_t
الذي يمكنه تخزين أعداد كبيرة جدًا. ولكن قد يواجه المطورون تحديات عند الحاجة إلى تقسيم هذه الأعداد الكبيرة إلى أجزاء أصغر. سنستعرض في هذا المقال كيفية تقسيم boost::multiprecision::int128_t
إلى جزئين: الجزء العالي (hi) والجزء المنخفض (lo) كنوعين من int64_t
.
الأساسيات حول boost::multiprecision::int128_t
تعتبر boost::multiprecision::int128_t
نوع بيانات دقيق يمكنه تخزين قيم تصل إلى 128 بت، مما يجعله مفيدًا في الحسابات المعقدة أو عند التعامل مع الأعداد الكبيرة بشكل عام. ومع ذلك، في بعض التطبيقات، قد تحتاج إلى استخدام الأرقام كـ int64_t
، وهي نوعية بيانات يمكن أن تتعامل مع قيم تصل إلى 64 بت فقط. لذلك، من المهم معرفة كيفية تقسيم هذه الأعداد الكبيرة دون فقدان المعلومات.
كيفية تقسيم int128_t إلى hi و lo
للبدء في تقسيم boost::multiprecision::int128_t
إلى أجزاء صغيرة، يمكننا استخدام عملية بسيطة تعتمد على العمليات الرياضية. الفكرة الأساسية هي استخدام القيم الثنائية للعدد وتقسيمها. يمكن تلخيص العملية كالتالي:
-
الحصول على الجزء المنخفض (low): يمكننا الحصول على الجزء المنخفض من العدد عن طريق استخدام عملية القسمة المودولية مع
UINT64_MAX
(أعلى قيمة يمكن أن يحملهاint64_t
). - الحصول على الجزء العالي (high): بعد أن نحصل على الجزء المنخفض، يمكننا استخدام عملية القسمة العادية للحصول على الجزء العالي.
إليك مثال بسيط على كيفية فعل ذلك:
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
using namespace boost::multiprecision;
void split_int128(int128_t number, int64_t &hi, int64_t &lo) {
lo = static_cast<int64_t>(number % 0x10000000000000000); // 2^64
hi = static_cast<int64_t>(number >> 64);
}
int main() {
int128_t number = int128_t("340282366920938463463374607431768211456"); // مثال على عدد كبير
int64_t hi, lo;
split_int128(number, hi, lo);
std::cout << "High part: " << hi << ", Low part: " << lo << std::endl;
return 0;
}
في هذا الكود، نقوم بتعريف دالة split_int128
التي تأخذ عددًا من نوع int128_t
وتقوم بتقسيمه إلى جزئين – hi
و lo
– باستخدام العمليات الرياضية المناسبة.
التحقق من النتائج
من المهم التحقق من النتائج بعد التقسيم. يمكن أن يتم ذلك عن طريق إعادة تجميع الأجزاء الناتجة. إذا كانت القيم تعود إلى القيمة الأصلية، فهذا يعني أننا قمنا بالعملية بشكل صحيح.
int128_t reconstructed = (static_cast<int128_t>(hi) << 64) | static_cast<int128_t>(lo);
الخلاصة
لقد استعرضنا كيفية تقسيم boost::multiprecision::int128_t
إلى جزئين int64_t
. هذه العملية تعتبر ضرورية عند التعامل مع الأعداد الكبيرة، حيث يسمح لنا الانقسام بالاستفادة من قوة int64_t
في الحسابات دون فقدان المعلومات. لذلك، بمعرفتك لهذه الطريقة، يمكنك الآن التعامل مع الأعداد الكبيرة بكفاءة أعلى وتحتفظ بدقة النتائج المطلوبة.
كيف يمكنني تقسيم boost::multiprecision::int128_t
إلى أجزاء int64_t
هو سؤال مهم لكل مبرمج يعمل في مجال الأعداد الكبيرة، ومن خلال اتباع الخطوات المذكورة أعلاه، يمكنك تحقيق ذلك بسهولة.