一元减号运算符如何在C++中使用布尔值?

Wra*_*967 5 c++ unary-operator

我目前正在将一些OpenCV代码从C++转换为Java.我不能使用JavaCV,因为我们需要在本机Java中进行转换,而不是JNA.在代码中的某一点,我得到以下任务:

dst[x] = (uchar)(-(kHit >= kForeground));
Run Code Online (Sandbox Code Playgroud)

dstuchar*,kHitkForegroundint秒.

我一直无法找到有关其工作原理的任何信息,Java也不会将其识别为操作.这两个变量在代码的另一个点上有一个操作,它存储两个值中的一个:255或0.

有问题的代码来自opencv/video/src/bgfg_gaussmix.cpp.

das*_*ght 7

在C++中,布尔表达式产生两个值之一 - 01.当您将一元减号-应用于结果时,您得到0-1.当你重新解释-1uchar,你得到255.

您可以使用条件将此表达式转换为Java:

dst[x] = (kHit >= kForeground) ? 255 : 0;
Run Code Online (Sandbox Code Playgroud)

由于分支,它不会像原始分支一样快.然而,由于Java缺乏将布尔值重新解释为数值的能力,因此关于它的速度几乎无法做到.


Luc*_*ore 6

kHit >= kForeground返回或者,true或者false以C++的方式返回1或者0.前面的减号将其转换为-10.演员以uchar((uchar))返回00后回255为负-1.

在康拉德的评论之后,我也怀疑这个定义是否明确.它定义明确,但就可读性而言,它仍然是一段糟糕的代码.:)

  • 在*some*compiler/machine上.这段代码是不必要的不​​可移植的. (3认同)
  • C++标准是否明确指定无符号类型的行为就像二进制补码一样,所以这应该被很好地定义(因为true == 1和false == 0也定义得很好)? (2认同)