Java整数循环迭代速记

Java整数循环迭代速记,java,iteration,Java,Iteration,当我编码时,我发现自己 经常执行以下操作: corner++; if(corner == 4) corner = 0; 是否有人在同一行中执行此操作 在此示例中,角点应为0、1、2、3、0、1、2、3、0….使用余数。有两条线,但很干净 corner++; corner %= 4; 您可以这样做: corner = ++corner == 4 ? 0 : corner; 如果您的corner==4测试未通过,您可以将其他内容分配给corner变量。您可以使用这种简短的可读行(): 或者,

当我编码时,我发现自己 经常执行以下操作:

corner++; 
if(corner == 4) corner = 0;
是否有人在同一行中执行此操作


在此示例中,角点应为0、1、2、3、0、1、2、3、0….

使用余数。有两条线,但很干净

corner++;
corner %= 4;
您可以这样做:

corner = ++corner == 4 ? 0 : corner;

如果您的
corner==4
测试未通过,您可以将其他内容分配给
corner
变量。

您可以使用这种简短的可读行():

或者,再短一点():

我使用:

这并不明显,但要快得多,因为除法的执行速度通常比任何按位操作都慢

corner = ++corner & 3;
编辑:令人惊讶的是,我发现了一种更棒的骑自行车的方法——轮班,而且它跑得更快

corner = ++corner << 30 >>> 30;
corner=++corner>>30;
这个技巧只适用于2的任何幂


显示所有结果(尽管它是javascript,而不是java)

什么更有效?老实说,我现在只是个古玩。@TheJohnMajor01:对不起,那纯粹是过早的优化。它们都很简单。更重要的是,5个月后什么更容易理解和调试。@Boann首先,这一点都不重要。但是一个带有常数的mod可以转换成
op(如果你不能证明角点总是正的,编译器需要更多的角点),这可能比分支更快。最重要的是:你真的不能做任何这样的笼统的陈述,因为有很多不同的CPU体系结构,具有一些非常不同的特性(一个分支在SIMD体系结构上非常昂贵,而SIMD体系结构恰好非常擅长进行划分)@Morgen并不是说gcc/clang/etc.在被请求时也不会执行这种优化,尽管是在编译时。虽然是这样,但必须指出的是,不应力求简洁,因为这样可能会使代码更难一目了然地理解,使未来必须维护代码的程序员更加困难。@HovercraftFullOfEels虽然你也是对的,但OP追求的是简洁,而不是清晰;&他会得到他所要求的。答案既不简短也不清楚。只是一团糟-1这也不是复杂的代码,三元语句的结构非常简单。当然,
(corner+1)
++corner
更清晰,但这并不复杂。根据
++x
x++
之间的差异,避免出现结果不同的代码,以及2。避免在同一语句中以非平凡的方式读取、修改和写入值的代码(如本例中的
corner
)。但是这里每个人都有自己的主观优先权……我否决了这一点,因为使用
++
内联太令人困惑了。当我阅读时,很难在脑海中保持操作顺序,而且很容易忽略
if
语句包含副作用。@jpmc26如果是
corner++
,我可以理解。但是,它是“代码> ++角”/代码>,所以操作顺序是一个完全直接的左撇子。您可能会发现对未来有帮助。如果您发现自己经常做某事,则应该考虑提取方法,而不是使代码更短(这通常是不可读的)。
if (++corner == 4) corner = 0;
corner = ++corner & 3;
corner = ++corner << 30 >>> 30;