首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对奇数进行测试

对奇数进行测试
EN

Stack Overflow用户
提问于 2013-04-12 21:37:42
回答 2查看 236关注 0票数 8

最常见的是,模运算符%用于测试偶数或奇数。

现在我的问题是,使用逐位AND对奇数进行测试有什么问题吗?因为测试最右边的位是1还是0比对2进行模数检查更自然

并且由于32位转换不改变最右边的位。

两者都有

(1 + Math.pow(2,52)) & 1 //1

(1 + Math.pow(2,52)) % 2 //1

产生相同的结果。

有没有理由喜欢模运算符而不是逐位运算符?

编辑:此问题仅说明64位精度范围内的值,因为只有偶数可以精确表示2^53以上的值,因此两个操作数都失败(9007199254740993 % 2 //0)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-12 21:38:25

在JavaScript中,使用任何按位运算符都会导致数字首先被截断为32位整数。这意味着它对一些较大的值不起作用。(好吧,有很多更大的值:-)

%操作符不会这样做。

C5H8NNaO4指出,整数截断过程应该保留低位,如果你只考虑去掉尾数的顶部,这是有直觉的,实际上,一些粗略的“测试”表明它似乎工作得很好。

当然,对于非常大的值,事情变得更加复杂,当用不精确的浮点数表示时,可能是奇数或偶数,因为缺少最低有效的数字。换句话说,当浮点值中的二进制指数产生一个大于尾数容量(我认为是53位)的有效值时,你要么必须考虑所有这样的数字为偶数(因为低位总是零),要么你必须认为问题是不确定的。

应该清楚的是,我不是一个数学家。

票数 7
EN

Stack Overflow用户

发布于 2013-04-12 22:17:53

如果您的数字总是可以很好地转换为32位整数,那么Bitwise看起来可以更快--我猜一些javascript引擎可以将其快速转换为硬件位操作。我已经构建了一个jsperf来测试它:

http://jsperf.com/evenness

我在Firefox20上得到的结果非常不稳定,有时Bitwise稍微快一些,有时快很多倍。

如果你的数字可以或者不能很好地转换成32位整数,那么坚持模数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15972835

复制
相关文章

相似问题

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