我有一段代码,其中我乘以两个数字,但条件是这些整数不应该为0.如果它是0,我需要将它设为1,以便它不被计算。
y=x*z // x>0, z>0. if x==0 then x=1, if z==0, then z=1;
我想避免"如果"条件检查每个变量并替换为1.是否有更好的方法。
答案 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进行比较,生成false
或true
。然后将其转换为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;
这可以保证此代码中没有分支,并且x
或z
都不等于0
。但要付出的代价是精确的,因为您可能会意外地将1
添加到x
或z
:
00000000 | 1 = 1
10001011 | 1 = 10001011
10101010 | 1 = 10101011 <- imprecision introduced!