побитовая операция ИЛИ для std :: array - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть c ++ std :: array typedef'd следующим образом:

typedef std::array<uint64_t, 2>MyType;

Если у меня есть два экземпляра «MyType», и я хотел выполнить побитовое «ИЛИ» для этих двух экземпляров, В настоящее время у меня есть код следующим образом:

MyType instance1 { 11, 22 };
MyType instance2 { 33, 44 };
MyType output {0, 0};
for(int i = 0; i < 2; ++i)
{
  output[i] |= instance1[i];
  output[i] |= instance2[i];
}

Результаты выполнения этого:

output [0] = 43; output [1] = 62;

Мой вопрос Есть ли другой способ сделать это побитовое «ИЛИ» (кроме циклического прохождения элементов по одному?)

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете использовать std::transform, который затем выполняет итерации для вас, как я сделал здесь:

#include <iostream>
#include <array>
#include <algorithm> // std::transform
#include <functional> //std::bit_or

typedef std::array<uint64_t, 2 > MyType;

int main()
{
    MyType instance1 { 11, 22 };
    MyType instance2 { 33, 44 };
    MyType output {0, 0};

    std::transform(output.begin(), output.end(), instance1.begin(), output.begin(), std::bit_or<uint64_t>());
    std::transform(output.begin(), output.end(), instance2.begin(), output.begin(), std::bit_or<uint64_t>());

    for(int i = 0; i < 2; ++i) std::cout << output[i] << std::endl;
}

Демонстрация: http://www.cpp.sh/94cs4

Примечание что я считаю ваш оригинальный код более читабельным, чем этот. Я бы использовал std::transform только в более сложных ситуациях.

Тем не менее, что вы на самом деле пытаетесь решить?
Если вы ищете удобство простых компонентных операций, как можно найти, например, в Matlab, а не в моих знаниях. Вы можете написать свой собственный контейнерный класс, подобный std::vector и std::array, и иметь определенные операторы, такие как | в вашем случае, для работы с ними.

...