什么是取代整数' 0'的最佳方法。用' 1'在c ++中

时间:2016-06-21 05:06:37

标签: c++

我有一段代码,其中我乘以两个数字,但条件是这些整数不应该为0.如果它是0,我需要将它设为1,以便它不被计算。

y=x*z // x>0, z>0. if x==0 then x=1, if z==0, then z=1;

我想避免"如果"条件检查每个变量并替换为1.是否有更好的方法。

9 个答案:

答案 0 :(得分:15)

下面

y=(x==0?1:x)*(z==0?1:z)

将为您提供此[ assembly ]代码。

并从@Jerry Coffin的评论中借用了[ answer ]

y=(x+(x==0))*(z+(z==0)); 

将为您提供此[ assembly ]代码。

答案 1 :(得分:9)

y = (!x ^ x) * (!z ^ z);

这是有效的,因为当你用0来表示数字时,你会得到相同的数字。因此,如果x != 0,则!x == 0!x ^ x等同于0 ^ x,即x。如果x == 0,则!x == 1!x ^ x相当于1 ^ 0,即1。

答案 2 :(得分:6)

老实说,我怀疑你能否提出一种表现明显不佳的方法。选择一些你以后可以阅读的东西而不是你认为最快的东西。有可能这个特定的操作不会成为瓶颈。

答案 3 :(得分:3)

我当然不会保证它会对您的代码产生任何积极影响,但有一种可能性是这样的:

x += int(x == 0);
z += int(z == 0);

这会将变量与0进行比较,生成falsetrue。然后将其转换为int,如果该值之前为非零则为0,如果为零则为1。然后我们将该结果添加到变量中,因此如果它为零,我们将添加一个,给出1.如果它是任何非零值,我们将零添加到它,这显然不会影响它值。

答案 4 :(得分:2)

y=max(x,1)*max(z,1);

如果需要,通过#define预处理程序关键字或作为普通函数定义最大函数。

答案 5 :(得分:1)

如果其中一个是0,那么添加会给您带来与将0更改为1

相同的结果
y = (x * z > 0 ? x * z : x + z)

答案 6 :(得分:1)

它会起作用

Y =(X X:1)*(Z Z:1)

答案 7 :(得分:0)

好吧,我使用了来自this answer的链接并创建了这样的代码。 assembly here,程序集更短,因此可能更快,但需要分析,因为更短的程序集可能不会更快。

<system.webServer>
  <modules>
    <remove name="RoleManager" />
  </modules>
</system.webServer> 

答案 8 :(得分:-2)

如果您关注的是精确结果,那么您应该使用评论中的if语句或大多数人建议的三元运算符?
如果你只关心这部分代码中没有分支,你可以随时OR 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!