عمليات bitwise على المتجه
-
27-09-2019 - |
سؤال
ما هي أفضل طريقة لأداء عمليات 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>());