سؤال

ما هي أفضل طريقة لأداء عمليات bitwise vector<bool>?

كما أفهم، vector<bool> هو التخصص الذي يستخدم بت واحد لكل منطقية. اخترت vector<bool> لأسباب حفظ الذاكرة. أعلم أن هناك بعض المشاكل مع vector<bool> ولكن لاحتياجاتي فهي ملائمة.

الآن - ما هي الطريقة الأكثر أداء لعمليات bitwise إلى كل هذه المتجهات؟

إذا قمت بذلك في حلقة وقراءة كل منطق واحد وتخزينه ، فإن الطريقة التي أفهمها بها يتم إجراء المزيد من العمليات في الداخل للوصول إلى القيم الفعلية.

شكرًا!

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

المحلول

إذا تم إصلاح عدد البتات في وقت الترجمة ، فستكون أفضل حالًا في الاستخدام std::bitset

إذا لم يكن الأمر كذلك ، (أي عدد البتات يختلف في وقت التشغيل) ، فعليك أن ترى ويمكنك استخدامها boost::dynamic_bitset)

في كل من هذين ، من السهل للغاية القيام بجميع عمليات bitwise.

نصائح أخرى

تجاهل عنوان سؤالك ، دعنا نجيب هذه سؤال ، بدلاً من ذلك:

ما هي أفضل طريقة لأداء عمليات bitwise على المتجه؟

أفضل طريقة هي تحديد المتجه الخاص بك vector<unsigned char> (أو vector<uint32_t>, ، أو أي نوع آخر عدد صحيح تختاره) ، وقم بتشغيل عملياتك في اتجاهين كيف ستحصل عادة على مجموعة من الأعداد الصحيحة غير الموقعة. ستكون الأمور أسرع بكثير بهذه الطريقة ، ولن تكون هناك آلية خفية.

يمكنك استخدام Division (أو مشغلي bitwise ، إذا كنت بقعة) لحل فهرس الصفيف الذي تحتاجه إلى العمل ، وللحصول لتطبيق عمليات bitwise أكبر من عنصر واحد.

هذا سؤال ذي صلة:قليلا twiddling الكثير من البتات في ج

ستقوم في الأساس بهذه العمليات نفسها ، إذا قررت أن تقرر الالتفاف vector<unsigned some-int-type> مع مشغليك.

قرأت هاتين الإجابات ، لكنني أردت فقط حلًا سريعًا ، ونفذت شيئًا فظيعًا.

يمكنك جعل مشغلي bitwise يعملون عليها vector<bool>, ، ولكن يجب أن يكون الكود متخصصًا في تنفيذ المكتبة القياسية C ++ أو العودة إلى النموذج البطيء. ها أنا operator| لـ GNU LIBSTDC ++-V3:

std::vector<bool> operator|(std::vector<bool> A, const std::vector<bool>& B)
{
    if (A.size() != B.size())
        throw std::invalid_argument("differently sized bitwise operands");

    std::vector<bool>::iterator itA = A.begin();
    std::vector<bool>::const_iterator itB = B.begin();

    // c++ implementation-specific
    while (itA < A.end())
        *(itA._M_p ++) |= *(itB._M_p ++); // word-at-a-time bitwise operation

    return A;
}

هذا بالطبع سيء جدا. يقوم شخص ما بتحديث GCC ، ويقوم الإصدار الجديد بتخزين الأشياء بشكل مختلف ، ويكسر التعليمات البرمجية دون سبب واضح.

هذا يجب أن تعمل أيضا.

std::vector<bool> v3(v1.size());
std::transform(v1.begin(), v1.end(), 
               v2.begin(), v3.begin(), std::logical_and<bool>());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top