运算符的实现似乎不正确,但我不确定
这是链接
https://github.com/NVIDIA/cuda-samples/blob/master/Common/nvMatrix.h
https://github.com/NVIDIA/cuda-samples/blob/master/Common/nvVector.h
friend bool operator != (const quaternion<T> &lhs, const quaternion<T> &rhs)
{
bool r = true;
for (int i = 0; i < 4; i++)
{
r &= lhs._array[i] == rhs._array[i];
}
return r;
}
以及向量和矩阵模板。
friend bool operator != (const vec4<T> &lhs, const vec4<T> &rhs)
{
bool r = true;
for (int i = 0; i < lhs.size(); i++)
{
r &= lhs._array[i] != rhs._array[i];
}
return r;
}
friend bool operator != (const matrix4 &lhs, const matrix4 &rhs)
{
bool r = true;
for (int i = 0; i < 16; i++)
{
r &= lhs._array[i] != rhs._array[i];
}
return r;
}
当所有元素都相等时,一个矩阵与另一个矩阵相等,如果只有一个不同的元素,则这两个矩阵是不同的。但在这里,所有的元素都必须不同,这样返回值才能为真,我无法理解这一点。
不过这里的代码不是这样工作的。您只需要其中一个值不同即可返回true
。
让我们看看这部分:
bool r = true;
for (int i = 0; i < 4; i++)
{
r &= lhs._array[i] != rhs._array[i];
}
让我们假设:
lhs._array = [0,1,2,3]
rhs._array = [1,1,1,3]
当i
为0
时,r &= lhs._array[i] != rhs._array[i]
将变为:
r &= 0 != 1
// or
r &= true
并且由于true & true => true
,所以r
是true
。
现在,如果i
是1
,则r &= lhs._array[i] != rhs._array[I]
将变为:
r &= 1 != 1
// or
r &= false
由于true & false => false
,r
现在就是false
。
现在,如果i
是2
,则r &= lhs._array[i] != rhs._array[I]
将变为:
r &= 2 != 1
// or
r &= true
由于false & true => false
,r
仍然是false
。
现在,如果i
是3
,那么r &= lhs._array[i] != rhs._array[I]
将变为:
r &= 3 != 3
// or
r &= false
由于false & false => false
,r
仍然是false
。
总之,当lhs._array[i] != rhs._array[i]
第一次成为false
时,r
将变成false
,并且它将在循环的其余部分保持false
。