首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以对数组(一段长内存)使用按位操作?

是否可以对数组(一段长内存)使用按位操作?
EN

Stack Overflow用户
提问于 2017-08-24 16:46:41
回答 2查看 98关注 0票数 5

有两个数组如下所示

代码语言:javascript
运行
复制
int a[100]={1,1,...}
int b[100]={2,5,...}

有没有办法像这样操作它们?

代码语言:javascript
运行
复制
c=a|b

c的结果是

代码语言:javascript
运行
复制
{3,5,...}

我想像memcpy那样直接操作内存

我不想使用循环

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-24 16:59:35

按位操作的工作方式是将操作的元素移动到寄存器中,然后对寄存器执行操作。这意味着您受限于操作寄存器的大小,这是与硬件相关的,但充其量是64位(或者在一些新的硬件情况下是128位)。这意味着,即使有一些诡计,您也可以同时执行2次按位操作。如果你关心的是速度,我建议你用平行的方式来达到你的目标。我还必须提到,您的示例在堆栈上创建了数组,它限制了数组的大小,这意味着您将无法看到明显的速度变化。

票数 3
EN

Stack Overflow用户

发布于 2017-08-24 17:00:22

您可以在c++中声明自己的数组类型,并重载operator&()函数:

代码语言:javascript
运行
复制
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) {
     }
     // ...
};

然后用这种方法

代码语言:javascript
运行
复制
MyArray<int,100> a { 1,1, /* ... */ };
MyArray<int,100> b { 2,5, /* ... */ };

MyArray<int,100> c = a&b;

还可以直接重载operator&()函数用于std::array (可能是@Jarod提出的最简单的方法):

代码语言:javascript
运行
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45867029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档