ما هي الطريقة الأكثر بساطة / أنيقة لحساب طول عدد مكتوب باسم النص؟

StackOverflow https://stackoverflow.com/questions/1260244

  •  12-09-2019
  •  | 
  •  

سؤال

بالنظر إلى أقصى قيمة ممكنة، وكيفية التعبير عن المساحة اللازمة لكتابة هذا الرقم في النموذج العشري كنص؟

المهمة الحقيقية: تسجيل معرفات عملية التسجيل (pid_t) مع طول ثابت، باستخدام دول مجلس التعاون الخليجي على لينكس. سيكون من الجيد أن يكون لديك تعبير وقت ترجمة لاستخدامه في std::setw() iomanipulator.

لقد وجدت ذلك لينكس / الموضوعs.H. Header يحتوي على أ PID_MAX القيمة مع الحد الأقصى ل PID المخصصة لعملية. حتى وجود

#define LENGTH(t) sizeof(#t)-1

ال LENGTH(PID_MAX) سيكون تعبير توقيت الترجمة، ولكن لسوء الحظ، يتم تعريف هذا الرقم في HEXA:

#define PID_MAX 0x8000

أفضل حل الحالي هو غريب بعض الشيء

static_cast<int>( ::floor( ::log(PID_MAX)/::log(10) + 1 ) );

ولكن هذا يتم حساب وقت التشغيل ويستخدم الوظائف من الرياضيات

هل كانت مفيدة؟

المحلول

يمكنك أن تفعل ذلك مع برمجة تا القوالب قليلا:

//NunLength_interal does the actual calculation. 
template <unsigned num>
struct NumLength_internal
{ enum { value = 1 + NumLength_internal<num/10>::value }; };

template <>
struct NumLength_internal<0>
{ enum { value = 0 }; };

//NumLength is a wrapper to handle zero. For zero we want to return
//a length of one as a special case.
template <unsigned num>
struct NumLength
{ enum { value = NumLength_internal<num>::value };};

template <>
struct NumLength<0>
{ enum { value = 1 }; };

هذا يجب أن يعمل من أجل أي شيء الآن. علي سبيل المثال:

cout << NumLength<0>::value      << endl; // writes: 1
cout << NumLength<5>::value      << endl; // writes: 1
cout << NumLength<10>::value     << endl; // writes: 2
cout << NumLength<123>::value    << endl; // writes: 3
cout << NumLength<0x8000>::value << endl; // writes: 5

كل هذا يتعامل مع وقت الترجمة.

تحرير: أضفت طبقة أخرى للتعامل مع القضية عندما يكون الرقم الذي تم تمريره هو صفر.

نصائح أخرى

لا أعتقد أنه يمكنك الحصول عليها بالضبط دون استدعاء اللوغاريثز، ولكن يمكنك الحصول على حد أعلى:

CHAR_BIT * sizeof(PID_MAX) سوف تعطيك ملزمة أعلى على عدد البتات اللازمة لتمثيل pid_max. يمكنك ذلك بعد ذلك سجل السجل (10) = 3.32 وجولة لأسفل إلى 3. انسى الكلمة، لأن الانقسام عدد صحيح سوف اقتطع مثل هذا على أي حال. وبالتالي

#define LENGTH(t) (((CHAR_BIT * sizeof(t)) / 3) + 1)

يجب أن تعطيك جزءا كبيرا محوسا محوسبا للجميع على عدد الأحرف اللازمة لعرض ر رقم عشري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top