没有赋值运算符的按位NOT运算 - posible?

时间:2016-03-30 09:40:51

标签: c++ opencv operators bit-manipulation

我知道我可以通过这种方式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个步骤。

注意:如果此问题中存在措辞问题 - 请建议我如何解决问题。英语不是我的自然语言。对不起,我很抱歉。

感谢帮助者。

2 个答案:

答案 0 :(得分:0)

我很确定为++ foo和foo ++生成的程序集是相同的,如果你不将它与任何东西相符。 但正如你所说,如果你做foo = ~foo,需要额外的操作。 您可以查看这个简单的测试,看看我的意思:https://godbolt.org/g/he4xRP 否则,如果在局部变量中执行=〜运算,它会直接在它所在的寄存器中,因此只需一条指令。

据我所知,c / c ++中没有~~或〜=

答案 1 :(得分:0)

OpenCV足够聪明,可以在不需要时避免内存分配和复制。

由于src中的dstbitwise_not(src, dst)矩阵相同,因此您不会分配新内存,也不会复制结果。您可以就地执行此操作。

在实践中,会发生的事情如下:

  1. 创建目标矩阵
    • 如果dst等于src,则不要分配任何内容。让dst指向与src
    • 相同的数据
    • 否则dst分配src
    • 的相同大小和类型
  2. 执行操作:dst(i) = op(src(i))(其中op在这种情况下是按位而不是)
  3. 请注意:

    bitwise_not(src, dst);
    dst = ~src;
    

    并不完全等效,但最后dst = ~src会调用bitwise_not(src, dst)