在 c++ 中用 '1' 替换整数'0'的最佳方法是什么

What is most optimal way to replace integer '0' with '1' in c++

本文关键字:最佳 是什么 方法 c++ 中用 替换 整数      更新时间:2023-10-16

我有一个代码,其中我乘以两个数字,但条件不是这些整数编号为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进行比较,产生falsetrue。然后将其转换为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;

这将保证此代码中不会有分支,并且xz都不等于0。但是要付款的价格是精确的,因为您总是可以意外地将1添加到xz

00000000 | 1 = 1
10001011 | 1 = 10001011
10101010 | 1 = 10101011 <- imprecision introduced!
相关文章: