& 在这段代码中的作用是啥?

Posted

技术标签:

【中文标题】& 在这段代码中的作用是啥?【英文标题】:What is the role of & in this piece of code?& 在这段代码中的作用是什么? 【发布时间】:2019-10-16 03:43:53 【问题描述】:

我正在尝试理解foam-extend 中的dbns 代码。但我对下面给出的以下代码的特定部分有点怀疑。

deltaRLeft & gradrho[own] 或

deltaRRight & gradU[nei]

我这里用的东西&是一个引用运算符,但是如果有人能详细解释一下,对我有帮助。

    Flux::evaluateFlux
    (
        rhoFlux_[faceI],
        rhoUFlux_[faceI],
        rhoEFlux_[faceI],
        rho_[own] + rhoLimiter[own]*(deltaRLeft & gradrho[own]),
        rho_[nei] + rhoLimiter[nei]*(deltaRRight & gradrho[nei]),
        U_[own] + cmptMultiply(ULimiter[own], (deltaRLeft & gradU[own])),
        U_[nei] + cmptMultiply(ULimiter[nei], (deltaRRight & gradU[nei])),
        T_[own] + TLimiter[own]*(deltaRLeft & gradT[own]),
        T_[nei] + TLimiter[nei]*(deltaRRight & gradT[nei]),
        R[own],
        R[nei],
        Cv[own],
        Cv[nei],
        Cp[own],
        Cp[nei],
        Sf[faceI],
        magSf[faceI]
    );

&这里到底在做什么,如果可以详细解释的话。 部分代码来自dbns/numericFlux/numericFlux.C

【问题讨论】:

【参考方案1】:

这是按位和运算符。

它将第一个操作数的每个位与第二个操作数的相应位进行比较。 如果两个位都为 1,则结果位设置为 1,否则为 0。

例如:

     11001001  
   & 10111000 
     -------- 
   = 10001000

【讨论】:

运算符 & 被 OpenFOAM 类重载。查看@Herpes-Free-Engineer 的答案【参考方案2】:

恐怕first 和second 的答案大多不适用于 OpenFOAM 上下文。

在 OpenFOAM 上下文中,如果操作数是张量,& 就是 inner product。因此,deltaRRightgradT[nei] 实际上是张量对象。

请查看OpenFOAM's programmers' guide,第 1.4.1 和 1.3.1 节。

【讨论】:

这是 OpenFOAM 上下文中的正确答案。为什么没有人支持它?或者接受它是正确的(@Bidesh-Sengupta)【参考方案3】:

有两个不同的& 运算符。

按位与运算符 (&) 将第一个操作数的每个位与第二个操作数的相应位进行比较。如果两个位都为1,则对应的结果位设置为1。否则,对应的结果位设置为0。

按位与运算符的两个操作数都必须是整数类型。

例如:

#include <iostream>

using namespace std;

int main() 
   unsigned short a = 0xFFFF;      // pattern 1111 ...
   unsigned short b = 0xAAAA;      // pattern 1010 ...

   cout  << hex << ( a & b ) << endl;   // prints "aaaa", pattern 1010 ...

【讨论】:

以上是关于& 在这段代码中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码中的“”是啥,它的基本作用是啥?

下一步是啥();在这段代码中?

对 struct 在这段代码中的工作方式感到困惑

这段代码中的错误/错误是啥 c++ 告诉我更正?

这段代码中的“.get(0)”是啥?

为啥垂直对齐:中间;在这段代码中不起作用? [复制]