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;
}