Java:在忽略符号的情况下执行数学运算
我想做一个游戏,包括计算执行一些简单数学运算所需的力。我有一个Java:在忽略符号的情况下执行数学运算,java,math,integer,bit-manipulation,sign,Java,Math,Integer,Bit Manipulation,Sign,我想做一个游戏,包括计算执行一些简单数学运算所需的力。我有一个dx变量,表示沿X轴的速度和方向。现在我想减去摩擦力,但如果dx的方向是负的,它必须是一个加法。在返回有符号值时,是否有任何方法可以使用绝对值从dx中减去摩擦力?我在寻找位运算符,但我不知道有什么可能性 我能做的(我想): 最安全的选择是使用条件。你不希望分数改变方向 dx = dx < -friction ? dx + friction : dx > friction ? dx - friction : 0 dx=dx
dx
变量,表示沿X轴的速度和方向。现在我想减去摩擦力,但如果dx
的方向是负的,它必须是一个加法。在返回有符号值时,是否有任何方法可以使用绝对值从dx
中减去摩擦力?我在寻找位运算符,但我不知道有什么可能性
我能做的(我想):
最安全的选择是使用条件。你不希望分数改变方向
dx = dx < -friction ? dx + friction : dx > friction ? dx - friction : 0
dx=dx<-摩擦力?dx+摩擦力:dx>摩擦力?dx-摩擦力:0
您的代码不正确,原因有两个:
不会消除符号。此外,它可能会错误地产生“假阳性”(即假负数)当位31设置为dx=(dx>1;
时,即使将1
替换为>>
也不会得到绝对值,因为>>
存储在两个补码中,而不是作为符号+值表示int
将是二进制表示形式的sign
或10000…00
,因此00000…00
不会将符号与其他计算结果合并(dx-摩擦)&sign
dx -= Integer.signum(dx) * friction;
用显而易见的方式去做:除非有性能问题,否则不要试图变得聪明
if(dx >0 ) {
dx -= friction;
} else {
dx += friction;
}
如果这看起来有点冗长,请将其隐藏在方法中:
dx = applyFriction(dx,friction);
int applyFriction(int pos, int friction) {
if(pos > 0) {
return pos - friction;
} else {
return pos + friction;
}
}
当<代码>abs(pos)时,这会出现问题
Math.abs
。请注意,优化可能会导致你的代码变得不可读且难以维护。因此,对于初学者来说尽量使你的代码尽可能干净,当你遇到性能问题时,通过基准测试确定问题的根源,只优化代码的瓶颈。在物理学中,你的方向符号并不重要。我建议使用这样一个事实,即动摩擦力是一种与绝对值成比例的力运动中物体的速度。也就是说,物体在[0,1]
范围内有一些摩擦系数μF
。速度的变化就是δV=μF∙v∙δt
其中V
是物体的初始速度向量,δt
是一段时间跨度
新的速度V'
由以下公式给出
V' = V - δV
= V - μF∙V∙δt
= V(1 - μF∙δt)
V'=V-δV
=V-μF∙v∙δt
=V(1-μF∙δt)
这样,您根本不需要处理符号,它很容易扩展到更高维度的情况
另一方面,请确保δt足够小,不会在模型中引入振荡。对,但dx>-friction或dx
int mult=Integer.signum(dx)
@slim精彩评论!我在错误的地方(在java.lang.Math
中)寻找signum
,但它不在那里。大约在1.5中引入此函数的同时,我停止了使用Java。非常感谢你!!!
dx = applyFriction(dx,friction);
int applyFriction(int pos, int friction) {
if(pos > 0) {
return pos - friction;
} else {
return pos + friction;
}
}
V' = V - δV
= V - μF∙V∙δt
= V(1 - μF∙δt)