不带赋值运算符的位NOT操作-可能

Bitwise NOT operation without the assignment operator - posible?

本文关键字:操作 可能 NOT 赋值运算符      更新时间:2023-10-16

我知道我可以用intValue++/++intValue而不是intValue = intValue+1的方式进行无需赋值的加法运算。

我想知道是否有可能做同样的事情,但使用Bitwise NOT操作。

我猜到的语法可能性很少,唯一没有以编译错误结束的是~~intValue。但当我打印变量时,我没有看到任何变化。

我为什么要这样做:

我知道,如果我在执行请求的操作时使用赋值操作(这种情况:"按位不"),那么根据我的逻辑,这就是低级别中发生的情况:

1) 为数据类型分配临时存储区域

2) 将intValue的值复制到临时存储区域

3) 对临时内存区域执行请求的操作(因此结果在临时区域)

4) 将结果从临时内存区域复制到内存区域intValue

5) 我真的不确定:取消分配临时内存地区

现在,我知道如果变量stors值很小,这并不是一个真正的问题

但是,如果变量是RGB颜色(图像数据)的数组,该怎么办?这就是我的情况。如果我在这里写的是正确的,那么这意味着它会进行复制以执行请求的操作。这是大量数据的情况

所以这就是为什么我想用这种方式"不按位"

目前,我正在使用OpenCV中的功能来执行请求的操作,我就是这样做的:

Mat matValue = imread("bmpTest.bmp", CV_LOAD_IMAGE_COLOR);
bitwise_not(matValue, matValue);
imshow("test", matValue);
waitKey(0);

因为这个函数的第二个参数是dst(目的地),所以我担心这个函数执行操作的方式是我上面描述的4或5个步骤

注意:如果这个问题中有措辞问题,请建议我如何解决这个问题。英语不是我的母语。很抱歉,我的情况不够清楚

感谢您的帮助

我非常确信,如果您不将其应用于任何内容,则为++foo和foo++生成的程序集是相同的。但正如您所说,如果您执行foo=~foo,则需要额外的操作。你可以查看这个简单的测试来了解我的意思:https://godbolt.org/g/he4xRP否则,如果在局部变量中执行=~运算,它将直接在其所在的寄存器中,因此只有一条指令。

据我所知,在c/c++中没有~~或~=这类东西

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

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

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

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

注意:

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

不是完全等效的,但在最后dst = ~src将调用bitwise_not(src, dst)