首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以最快的方式在Java上注册?

以最快的方式在Java上注册?
EN

Stack Overflow用户
提问于 2012-12-21 10:55:08
回答 3查看 54.4K关注 0票数 39

我希望得到float值的符号为-1或1的int值。

避免附加条件总是降低计算成本的一个好主意。例如,我可以想到的一种方法是使用快速bit-shift来获取标识:

代码语言:javascript
复制
float a = ...;
int sign = a >> 31; //0 for pos, 1 for neg
sign = ~sign; //1 for pos, 0 for neg
sign = sign << 1; //2 for pos, 0 for neg
sign -= 1; //-1 for pos, 1 for neg -- perfect.

或者更简单地说:

代码语言:javascript
复制
int sign = (~(a >> 31) << 1) - 1;
  1. 这看起来是个好办法吗?
  2. 考虑到环境问题( MSB持有标志),这是否适用于所有平台?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-21 10:56:41

您为什么不简单地使用:

代码语言:javascript
复制
int sign = (int) Math.signum(a); //1 cast for floating-points, 2 for Integer types

此外,大多数Number实现都有一个signum方法,它接受该类型的原语并返回一个int,因此您可以避免为额外的性能进行强制转换。

代码语言:javascript
复制
int sign1 = Integer.signum(12); //no casting
int sign2 = Long.signum(-24l); //no casting

它将返回+1 /0/ -1,并且经过优化以提供良好的性能。

作为参考,您可以查看the implementation in openJDK。有关的双边投资条约是:

代码语言:javascript
复制
public static float signum(float f) {
    return (f == 0.0f || isNaN(f)) ? f : copySign(1.0f, f);
}

public static boolean isNaN(float f) {
    return (f != f);
}

public static float copySign(float magnitude, float sign) {
    return rawCopySign(magnitude, (isNaN(sign) ? 1.0f : sign));
}

public static float rawCopySign(float magnitude, float sign) {
    return Float.intBitsToFloat((Float.floatToRawIntBits(sign)
            & (FloatConsts.SIGN_BIT_MASK))
            | (Float.floatToRawIntBits(magnitude)
            & (FloatConsts.EXP_BIT_MASK
            | FloatConsts.SIGNIF_BIT_MASK)));
}

static class FloatConsts {
    public static final int SIGN_BIT_MASK = -2147483648;
    public static final int EXP_BIT_MASK = 2139095040;
    public static final int SIGNIF_BIT_MASK = 8388607;
}
票数 88
EN

Stack Overflow用户

发布于 2012-12-21 12:04:51

如果只希望使用浮动值中的IEEE 754符号位,则可以使用:

代码语言:javascript
复制
/**
 * Gets the sign bit of a floating point value
 */
public static int signBit(float f) {
    return (Float.floatToIntBits(f)>>>31);
}

这是非常快,并有优势,没有分支。我认为这是在JVM上最快的。

但要确保这是你想要的!特别要注意特殊情况,例如,NaN在技术上可以有0或1符号位。

票数 9
EN

Stack Overflow用户

发布于 2012-12-21 11:03:56

如果绝对必要的话,您只应该尝试使用难读/理解优化。

问题与

代码语言:javascript
复制
int sign = Math.signum(a);

可能是如果0.0==a返回0

但是,只要有可能,您就应该依赖现有的库函数来保持代码易于阅读/理解。

如果您想要1用于0.0==a,那么下面的内容是:

代码语言:javascript
复制
int sign = (0>a)?-1:1;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13988805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档