我知道我可以通过这种方式intValue++
/ ++intValue
而不是intValue = intValue+1
添加操作而无需分配。
我想知道是否可以使用Bitwise NOT操作来执行相同的操作。
我猜到了一些语法可能性,唯一没有以编译错误结束的是~~intValue
。但是当我打印变量时,我没有看到任何变化。
我知道如果我在执行请求的操作时使用赋值操作(这种情况:"按位不是"),那么根据我的逻辑,这是在低级别中发生的事情:
1)为数据类型分配临时存储区
2)将
intValue
的值复制到临时存储区3)在临时存储区域执行请求的操作(所以 结果是在临时区域)
4)将结果从临时存储区复制到存储区
intValue
5)我对此并不十分确定:释放临时内存 区域。
现在,我知道如果变量存在小值,这不是一个真正的问题。
但是如果变量是RGB颜色数组(图像数据)怎么办?这是我的情况。如果我在这里写的是正确的,那么这意味着它会复制以执行请求的操作。这是大量数据的情况。
所以这就是为什么我要做"按位而不是"就这样。
目前我在OpenCV中使用函数来执行请求的操作,这就是我的方法:
Mat matValue = imread("bmpTest.bmp", CV_LOAD_IMAGE_COLOR);
bitwise_not(matValue, matValue);
imshow("test", matValue);
waitKey(0);
因为这个函数的第二个参数是dst
(目的地),所以我担心这个函数如何完成操作的方式是我上面描述的4或5个步骤。
注意:如果此问题中存在措辞问题 - 请建议我如何解决问题。英语不是我的自然语言。对不起,我很抱歉。
感谢帮助者。
答案 0 :(得分:0)
我很确定为++ foo和foo ++生成的程序集是相同的,如果你不将它与任何东西相符。 但正如你所说,如果你做foo = ~foo,需要额外的操作。 您可以查看这个简单的测试,看看我的意思:https://godbolt.org/g/he4xRP 否则,如果在局部变量中执行=〜运算,它会直接在它所在的寄存器中,因此只需一条指令。
据我所知,c / c ++中没有~~或〜=
答案 1 :(得分:0)
OpenCV足够聪明,可以在不需要时避免内存分配和复制。
由于src
中的dst
和bitwise_not(src, dst)
矩阵相同,因此您不会分配新内存,也不会复制结果。您可以就地执行此操作。
在实践中,会发生的事情如下:
dst
等于src
,则不要分配任何内容。让dst
指向与src
dst
分配src
dst(i) = op(src(i))
(其中op
在这种情况下是按位而不是)请注意:
bitwise_not(src, dst);
dst = ~src;
并不完全等效,但最后dst = ~src
会调用bitwise_not(src, dst)
。