在 c++ 中用 '1' 替换整数'0'的最佳方法是什么
What is most optimal way to replace integer '0' with '1' in c++
我有一个代码,其中我乘以两个数字,但条件不是这些整数编号为0。如果是0不计数。
y=x*z // x>0, z>0. if x==0 then x=1, if z==0, then z=1;
我想避免"如果"条件检查每个变量,然后替换为1。有更好的方法。
y=(x==0?1:x)*(z==0?1:z)
将为您提供此[汇编]代码。
和从@Jerry Coffin的评论借给他的[答案]
的调整y=(x+(x==0))*(z+(z==0));
将为您提供此[汇编]代码。
y = (!x ^ x) * (!z ^ z);
这起作用,因为当您XOR A的数字为0时,您将获得相同的数字。因此,如果x != 0
,则!x == 0
,并且!x ^ x
等于0 ^ x
,即x
。如果x == 0
,则!x == 1
,并且!x ^ x
等于1 ^ 0
,即1。
我诚实地怀疑您是否会提出一种表现不佳的方式。选择一些您可以阅读的内容,而不是您认为最快的内容。很有可能此特定操作不会是瓶颈。
我当然不会保证它会对您的代码产生任何积极影响,但是一种可能性就是这样:
x += int(x == 0);
z += int(z == 0);
这将变量与0进行比较,产生false
或true
。然后将其转换为int
,如果该值先前非零,则会给出0
,如果该值为零,则1
为零。然后,我们将结果添加到变量中,因此,如果它为零,我们将添加一个,给出1。如果它是任何非零值,我们会添加零,显然不会影响其值。
y=max(x,1)*max(z,1);
如有必要,定义最大函数,#define预处理器关键字或正常函数。
如果其中一个是 0
,那么添加将为您提供相同的结果,就像您将0
更改为1
y = (x * z > 0 ? x * z : x + z)
它将起作用
y =(x?x:1)*(z?z:1)
好吧,我使用了此答案中的链接并创建了这样的代码。组装在这里,组装较短,因此可能更快,但需要进行分析,因为较短的组装可能不会更快。
int main(int i, char**g)
{
int x = *g[0];
int z = *g[1];
int tmp = z ? 1 : z;
return (x==0?tmp:x*tmp);
}
如果您担心确切的结果,则应使用评论中的语句或三元操作员?
,如大多数人所建议的。
如果您只是在乎这部分代码中没有分支,则可以始终或1:
x = x | 1;
z = z | 1;
y = x * z;
这将保证此代码中不会有分支,并且x
或z
都不等于0
。但是要付款的价格是精确的,因为您总是可以意外地将1
添加到x
或z
:
00000000 | 1 = 1
10001011 | 1 = 10001011
10101010 | 1 = 10101011 <- imprecision introduced!
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 派生类销毁的最佳实践是什么
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?