لماذا تكون أجزاء std::bitset بترتيب عكسي؟[ينسخ]

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

  •  12-11-2019
  •  | 
  •  

سؤال

لماذا تقوم bitset بتخزين البتات بترتيب عكسي؟بعد معاناة عدة مرات، قمت أخيرًا بكتابة ملف Binary_to_dec هذا.هل يمكن تبسيطها؟

int binary_to_dec(std::string bin)
{
    std::bitset<8> bit;

    int c = bin.size();

    for (size_t i = 0; i < bin.size(); i++,c--)
    {
        bit.set(c-1, (bin[i]-'0' ? true : false));
    }

    return bit.to_ulong();
}
هل كانت مفيدة؟

المحلول

تقوم Bitset بتخزين أرقامها فيما تعتبره ترتيبًا "عكسيًا" لأننا نكتب أرقام الرقم متناقص ترتيب الأهمية على الرغم من أن أحرف السلسلة مرتبة في ازدياد ترتيب الفهرس.

إذا كتبنا أرقامنا بترتيب نهاية صغير، فلن يكون لديك هذا الارتباك لأن الحرف الموجود في الفهرس 0 من سلسلتك سيمثل البت 0 من مجموعة البت.لكننا نكتب الأعداد بالترتيب الأكبر.وأخشى أنني لا أعرف تفاصيل تاريخ البشرية التي أدت إلى تلك الاتفاقية.(ولاحظ أن endianness الذي تستخدمه أي وحدة معالجة مركزية معينة لتخزين أرقام متعددة البايت غير ذي صلة.أنا أتحدث عن endianness الذي نستخدمه عند عرض الأرقام ليقرأها البشر.)

على سبيل المثال، إذا كتبنا الرقم العشري 12 بالنظام الثنائي، فسنحصل على 1100.الجزء الأقل أهمية موجود على اليمين.نسمي ذلك "بت 0." ولكن إذا وضعنا ذلك في سلسلة ، "1100", ، ال شخصية في الفهرس 0 من تلك السلسلة يمثل البتة 3، وليس البتة 0.إذا قمنا بإنشاء مجموعة بتات تحتوي على البتات بنفس ترتيب الأحرف، to_ulong سيعود 3 بدلا من 12.

تحتوي فئة مجموعة البت على مُنشئ يقبل ملف std::string, ، لكنه يتوقع أن يتطابق فهرس الحرف مع فهرس البت، لذلك تحتاج إلى عكس السلسلة.جرب هذا:

int binary_to_dec(std::string const& bin)
{
  std::bitset<8> bit(std::string(bin.rbegin(), bin.rend()));
  return bit.to_ulong();
}

نصائح أخرى

unsigned long binary_to_dec(std::string bin)
{
    std::bitset<sizeof(unsigned long)*8> bits(bin);
    return bits.to_ulong();
}

يحرر:التنسيق ونوع الإرجاع.

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