العمليات على مستوى البت ممتعه جدا و لها تطبيقات لا حصر لها، يمكنك مراجعة هذه الصفحه لمزيد من التطبيقات.
المشكله التاليه واجهتنى اثناء تضمين النوع float_t و قمت بحلها و لكنى اطمح فى ايجاد حلول افضل.
النوع float كما يتم تضمينه تبعا لـ IEEE يأخذ الشكل التالي:
float sign = 1-bit exp = 8-bits frac = 23-bits double sign = 1-bit exp = 11-bits frac = 52-bits
و بشكل عام فإن المعادله للحصول على عدد البتات لكل جزء هى كالتالي: (بإفتراض ان المساحه الكليه بالبت و ممثله بقيمة المتغير n):
type size = n-bits sign = 1-bit exp = floor(4 * log2(n)) - 13 frac = n - (sign + exp)
مثلا للحصول على عدد البتات لنوع float64 - تم ذكره بالأعلي - تكون النتائج كالتالي:
type size = 64-bits sign = 1 exp = floor(4 * log2(64)) - 13 = 24 - 13 = 11 frac = 64 - (sign + exp) = 64 - (1 + 11) = 64 - 12 = 52
الأن نريد تضمين الفئه float_t كـ template class و شكلها المفترض ان يكون كالتالي:
template<typename t, unsigned size>
struct float_t
{
union
{
t all[ size/(CHAR_BIT*sizeof(t)) ];
struct
{
t sign:?;
t exp:?;
} parts;
} value;
};كما ترى قمت بعمل union ليحتوى على الـ sign و الأس و لكنى عدد البتات التى سيتم تحديدها لهم المفترض ان تتناسب مع المعادله التى تم وضعها بالأعلي.
لذا السؤال الأن كيف يتم تحديد عدد البتات لعناصر الـ union وقت الترجمه و ايضا كيف تتأكد من أن قيمة المتغير size هو من مضاعفات الرقم 2؟
ملاحظه: log2 لرقم صحيح هو عدد البتات المستهكله ما عدا اخر بت، بمعنى ان الرقم 5 يماثل 101 بالنظام الثنائي و بالتالي log2(5) = 2، راجع الربط بالأعلي لمثال تطبيقي.
**********************************
سؤال أخر: كيف تقوم بحساب log10 لرقم صحيح وقت الترجمه؟
و الله ولي التوفيق