有两个数组如下所示
int a[100]={1,1,...}
int b[100]={2,5,...}
有没有办法像这样操作它们?
c=a|b
c
的结果是
{3,5,...}
我想像memcpy那样直接操作内存
我不想使用循环
发布于 2017-08-24 16:59:35
按位操作的工作方式是将操作的元素移动到寄存器中,然后对寄存器执行操作。这意味着您受限于操作寄存器的大小,这是与硬件相关的,但充其量是64位(或者在一些新的硬件情况下是128位)。这意味着,即使有一些诡计,您也可以同时执行2次按位操作。如果你关心的是速度,我建议你用平行的方式来达到你的目标。我还必须提到,您的示例在堆栈上创建了数组,它限制了数组的大小,这意味着您将无法看到明显的速度变化。
发布于 2017-08-24 17:00:22
您可以在c++中声明自己的数组类型,并重载operator&()
函数:
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) {
}
// ...
};
然后用这种方法
MyArray<int,100> a { 1,1, /* ... */ };
MyArray<int,100> b { 2,5, /* ... */ };
MyArray<int,100> c = a&b;
还可以直接重载operator&()
函数用于std::array
(可能是@Jarod提出的最简单的方法):
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;
}
https://stackoverflow.com/questions/45867029
复制相似问题