C++ 是否可以对数组(一段很长的内存)使用位操作

C++ 是否可以对数组(一段很长的内存)使用位操作,c++,C++,有两个数组,如下所示 int a[100]={1,1,...} int b[100]={2,5,...} 有没有办法这样操作它们 c=a|b c的结果是 {3,5,...} 我想像memcpy一样直接操作内存 我不想使用循环按位操作的工作原理是将操作的元素移动到寄存器中,然后在寄存器上执行操作。这意味着您的操作仅限于寄存器的大小,这取决于硬件,但最多为64位(或在某些新硬件情况下为128位)。这意味着即使使用一些技巧,也可以同时执行2个位运算。如果你关心的是速度,我建议你使用并行来达到你的

有两个数组,如下所示

int a[100]={1,1,...}
int b[100]={2,5,...}
有没有办法这样操作它们

c=a|b
c
的结果是

{3,5,...}
我想像memcpy一样直接操作内存


我不想使用循环

按位操作的工作原理是将操作的元素移动到寄存器中,然后在寄存器上执行操作。这意味着您的操作仅限于寄存器的大小,这取决于硬件,但最多为64位(或在某些新硬件情况下为128位)。这意味着即使使用一些技巧,也可以同时执行2个位运算。如果你关心的是速度,我建议你使用并行来达到你的效果。我还必须提到,您的示例在堆栈上创建数组,限制数组的大小,这意味着您将无法看到明显的速度变化。

< P>可以在C++中声明自己的数组类型,并重载<代码>运算符和()函数:

template<typename T, size_t N>
class MyArray {
    template<typename X, size_t M>
    friend MyArray<X,M> operator&(const MyArray<X,M>& a, MyArray<X,M>& b) {
         MyArray<X,M> c;
         for(size_t i = 0; i < M; ++i) {
             c.array_[i] = a.array_[i] & b.array_[i];
         }
     }
     std::array<T,N> array_;
 public:
     MyArray() {
     }
     MyArray(std::initializer_list l) array_(l) {
     }
     // ...
};

c=a&b
-它将使
成为他们的地址。你不能
c=a&b
,但你可以用函数/算法做你想做的事。原样,您必须循环遍历各个数组元素并应用该操作。您必须在某个点上有一个循环,因为您需要访问每个n字节部分并按位将它们组合在一起。您的意思是
,而不是
&
。而且,有一个循环。@amadeu您很清楚,没有循环是不可能的。虽然它对客户端是隐藏的。只是显示循环必须存在于某个地方。顺便说一下,@jarod42评论是easier@AmadeusJarod的评论也暗示了一个循环。我只是想向OP展示,可以重载运算符函数。谢谢!现在我知道,如果没有循环,就不可能做到这一点。依赖CPU的SIMD指令可能会提供超过128位的数据。@drescherjm感谢您提供的信息。尽管如此,他还是受到寄存器大小的限制,一次只能做4个整数。他仍然需要在阵列中循环。我同意。谢谢!速度是我关心的问题。你完美地回答了我的问题!
MyArray<int,100> a { 1,1, /* ... */ };
MyArray<int,100> b { 2,5, /* ... */ };

MyArray<int,100> c = a&b;
template<typename T, size_t N>
std::array<T,N> operator&(const std::array<T,N>& a, std::array<T,N>& b) {
    std::array<T,N> c;
    std::transform(std::begin(a), std::end(a), std::begin(b), std::begin(c), [](T i1, T i2) { return i1 & i2; });
    return c;
}