ج: إجراء مقارنة موقعة في المتغيرات غير الموقعة دون صب

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

سؤال

اريد وظيفة مع التوقيع التالي:

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b);

يجب أن يكون ناتجه 1 IFF عرض 2's complement من البتات المخزنة في a أكبر من النظرة المكملة 2 للبت المخزنة في b. وإلا يجب أن يكون الإخراج 0. فمثلا:

signed_a_greater_than_signed_b(0b10000000,any number) => 0
signed_a_greater_than_signed_b(0b01111111,any number other than 0b01111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000001) => 0
signed_a_greater_than_signed_b(0b00000000,0b11111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000000) => 0

الوظيفة هي عدم وجود أي تحويلات ضمنية/صريحة (لأن هذه التحويلات محددة التنفيذ ، وبالتالي ليست محمولة)

أحد هذه التنفيذ هو:

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b)
{
    // if 'signed' a is positive then 
    //     return 1 if a is greater than b or b is negative
    // otherwise, if 'signed' a is negative then 
    //     return 1 if a is greater than b and b is negative
    if (a <= 0b01111111) return ((b < a) || (b > 0x01111111));
    else                 return ((b < a) && (b > 0x01111111));
}

هل يمكنك اقتراح تطبيق يستخدم الحساب بدلاً من الشرطية لأداء هذه الحسابات؟ يمكنك استخدام حالة واحدة إذا كان عليك

باستخدام مزيج من المتغيرات الموقعة/الموقعة في المقارنات والحساب في C هو وصفة للكارثة. هذه الوظيفة هي مثال على كيفية التحايل على المشكلة.

أعتقد أن التجميع وراء مقارنة المتغيرات الموقعة يشبه الوظيفة التي أريد تنفيذها (على البنية التي لا تدعم المقارنات الموقعة)

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

المحلول

على افتراض تكملة 2:

return (a^signbit) > (b^signbit);

أين signbit من الواضح أن MSB من التمثيل.

نصائح أخرى

يمكنك استخدام حالة واحدة إذا كان عليك

لديك بالفعل حل باستخدام حالة واحدة فقط. ؛)

كما ترغب في الحصول على عمليات حسابية بدلاً من الشرطية ، أفترض أن الهدف هو السرعة. واستخدام جدول البحث أسرع من الحساب. نظرًا لأنك تستخدم chars 8 بت ، فإن جدول البحث لا يعني عدم المبالغة: لا تحتاج حتى إلى جدول بحجم 256 × 256. حجم جدول 256 هو كافية لتخزين حد لكل قيمة a تشير إلى القيمة (ق) b قد يؤدي إلى أن يؤدي إلى صواب (أو خطأ). تحتاج كل استدعاء دالة فقط إلى إجراء البحث عن الجدول (a -> limit) ومقارنة واحدة (limit <> b).

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