C++ 如何实现_mm_和_ps?

C++ 如何实现_mm_和_ps?,c++,floating-point,bitwise-operators,intrinsics,C++,Floating Point,Bitwise Operators,Intrinsics,我正在尝试使用浮点值实现\u mm\u和\u ps。函数说这个函数是4个单精度浮点数的位,但我不知道如何计算2个浮点数的位。基本上我想实现以下内容 vector<float> bitwise_and(vector<float>a ,vector<float> b){ assert(a.size()==4); assert(b.size()==4); vector<float> res(4); for(int i=0;

我正在尝试使用浮点值实现
\u mm\u和\u ps
。函数说这个函数是4个单精度浮点数的位,但我不知道如何计算2个浮点数的位。基本上我想实现以下内容

vector<float> bitwise_and(vector<float>a ,vector<float> b){
    assert(a.size()==4);
    assert(b.size()==4);
    vector<float> res(4);
    for(int i=0;i<4;i++)
        res[i]=a[i]&b[i]; //here is the problem
    return res;

}
向量按位_和(向量a,向量b){
断言(a.size()=4);
断言(b.size()=4);
向量res(4);

对于(int i=0;i您可以通过
char*
指针访问每个字节的数据

vector<float> bitwise_and(vector<float>a ,vector<float> b){
    assert(a.size()==4);
    assert(b.size()==4);
    vector<float> res(4);
    for(int i=0;i<4;i++)
        for (size_t j = 0; j < sizeof(float); j++)
            reinterpret_cast<char*>(&res[i])[j]=
                reinterpret_cast<char*>(&a[i])[j]&
                reinterpret_cast<char*>(&b[i])[j];
    return res;

}

\uuum128
是一个SIMD向量,而不是
std::vector
可变长度容器。
\uuuuum128
更接近于
std::array
的建模。此外,您不必实现它,只需使用它。看起来您想要编写一个可移植的替代方案。无论如何,是的,它是IEEE754 FP位模式的按位和。(x86使用IEEE FP)。ISOC++不保证C99样式的联合类型双关。主流C++编译器确实定义了行为。(所有支持GNU扩展,MSVC至少)。C++ 20最终添加了不规则的语法,用于类型为双关的代码。
vector<float> bitwise_and(vector<float>a ,vector<float> b){
    assert(a.size()==4);
    assert(b.size()==4);
    assert(sizeof(float)==sizeof(int));
    vector<float> res(4);
    union hoge { float fl; int in; };
    for(int i=0;i<4;i++) {
        hoge res_h, a_h, b_h;
        a_h.fl = a[i];
        b_h.fl = b[i];
        res_h.in = a_h.in & b_h.in;
        res[i] = res_h.fl;
    }
    return res;
}