在C++中,一元减号运算符如何处理布尔值
How does the unary minus operator work on booleans in C++?
我目前正在将一些OpenCV代码从C++转换为Java。我不能使用JavaCV,因为我们需要本地Java的转换,而不是JNA。在代码的某一点上,我得到了以下任务:
dst[x] = (uchar)(-(kHit >= kForeground));
其中dst
是uchar*
,kHit
和kForeground
是int
s。
我一直找不到关于这是如何工作的任何信息,Java也不会将其识别为一个操作。在代码的另一个点上对这两个变量有一个操作,它存储两个值中的一个:255或0。
有问题的代码来自opencv/video/src/bgfg_gaussmix.cpp
。
在C++中,布尔表达式会产生两个值之一—0
或1
。将一元减去-
的值应用于结果时,将得到0
或-1
。当您将-1
重新解释为uchar
时,您将得到255
。
您可以使用条件将此表达式转换为Java
dst[x] = (kHit >= kForeground) ? 255 : 0;
由于分支的原因,它不会像原来那样快。然而,对于它的速度,您几乎无能为力,因为Java缺乏将布尔值重新解释为数字的能力。
kHit >= kForeground
返回true
或false
,在C++中,这意味着1
或0
。前面的减号将其转换为-1
或0
。对uchar
的强制转换((uchar)
)对于0
返回0
,并且对于负-1
返回到255
。
它的基本功能如下:
kHit >= kForeground
是布尔类型的表达式
-(kHit >= kForeground)
将该布尔转换为int(基于true==1
和false==0
)并求反,从而得到true==-1
和false==0
。
然后将其转换为uchar
,从而产生-1==255
和0==0
。
必须注意的是,尽管看起来像是在使用数字的底层实现细节,但所有这些转换都是由C++和C标准保证的,因为负无符号数字被指定为根据二进制补码表现。
但是,如果Java不支持这一点,您总是可以用一个条件赋值来代替它:
dst[x] = (kHit>=kForeground) ? 255 : 0;
表达式(kHit >= kForeground)
生成一个值为true
或false
的布尔值。当应用一元-
时,bool
被提升为int
,并且转换为true
的1
或false
的0
。升级后,符号被更改为-1
或0
,然后通过外部铸造转换为uchar
。
注意,信息的重要部分是一元operator-
不应用于布尔值,而是将布尔值转换为int
,然后应用它。这可以用一点模板魔法来测试:
template <typename T, typename U>
struct same_type {
static const bool value = false;
};
template <typename T>
struct same_type<T,T> {
static const bool value = true;
};
template <typename T>
void f( T value ) {
std::cout << "Is int? " << std::boolalpha << same_type<T, int>::value << "n";
std::cout << "Is bool? " << same_type<T, bool>::value << "n";
}
int main() {
f(-true);
}
f
模板通过使用上面的same_type
模板来测试针对int
和bool
传递的参数的类型(琐碎到可以理解)。如果我们用-true
作为参数类型来调用f
模板,则推导会将T
设置为表达式-true
的类型。如果您运行该程序,您将看到它打印Is int? truenIs bool? false
。
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 布尔比较运算符是如何在C++中工作的
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载Singly Linked List中的赋值运算符
- 使用赋值运算符重载从类中返回jobject
- 重载更少,则运算符返回相反的布尔值
- 将流运算符>>评估为布尔值
- 为什么在布尔值上使用两个"!"运算符?
- 布尔赋值运算符
- 重载运算符<<输出布尔值.为什么
- 对布尔值使用逐位not运算符(~)是否会调用Undefined Behavior
- 在 c++ 中布尔值上不是运算符
- 在C++中,一元减号运算符如何处理布尔值
- 移动后是否应该 std::function::运算符布尔值返回 false
- Int 被视为布尔值和运算符
- 运算符 |= 表示 C++ 中的布尔值
- 错误:无法将运算符从分数转换为布尔值
- 如何创建一个合适的布尔值 员工::运算符==(const Employee & rhs) const
- 不能使用运算符 != 表示布尔值