不带赋值运算符的位NOT操作-可能
Bitwise NOT operation without the assignment operator - posible?
我知道我可以用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)
中的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)
。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 是否有可能具有放入容器的移动操作的类型?
- 我想知道像素/片段的原始模板值.零还是一个?如果可能的话,以获取哪些特定操作会修改模板值
- C :动态编程,给定3个可能的操作
- C++为什么不可能将这两个操作合并在一行中?
- 嵌入式串行读取操作和桌面PC之间可能有什么区别
- 分段故障 C++ 最有可能在 strtok 操作中
- 不带赋值运算符的位NOT操作-可能
- SRP 是否与单个类的可能操作或其在其中的实现相关
- 推送和弹出操作的混合序列为什么这个序列是不可能的
- C++:存储复制操作不合理或不可能的资源
- 对于stl容器来说,end()可能是一个代价高昂的操作
- std::map上可能存在线程不安全操作
- 使用类作为操作数的操作在C++中成为可能
- GCC可能存在错误,foreach循环操作的是阴影,而不是实际对象
- 可能在刷新操作中写入文件失败
- 为什么我得到“操作可能未定义”?c++中的语句表达式