理解代码确定数字是否奇怪使用~~

时间:2017-09-16 02:18:35

标签: javascript

我既是一个JavaScript / Node n0ob ....但我最近正在使用这两个项目。我正在探索/ node_modules /文件夹,我遇到了一段似乎没有立即对我有用的特定代码。目标是确定一个数字是否是奇数。

具体的代码行是:

return !!(~~i & 1);

我的问题是'为什么我们需要~~'

(与How to determine if a number is odd in JavaScript相关,使用%2显示大部分答案)

认为我理解各个部分。

  • !!是否定运算符(两次)并将从真值/假值给我们一个真/假值
  • ~~是一种截断值的方法。 8.234变为8。
  • &安培;是按位和运算符。

但我还在质疑我们是否需要~~,若然,为什么?

我一直在使用N..toString(2) - 例如:

4.0.toString(2)
> "100"
4.1.toString(2)
> "100.0001100110011001100110011001100110011001100110011"

尝试理解二进制表示的外观。在第二个例子中,最右边的数字是1,但是当我插入4.1作为i的值时,它仍然正确地看到数字是偶数:

!!(~~4.1 & 1)
> false
!!(4.1 & 1)
> false

我已经读过Javascript使用的是IEEE 754标准,而且我还读到这里使用的所有按位运算符都做了一些我不完全理解的隐式转换,也许有些考虑因素我是没看见?

由于

1 个答案:

答案 0 :(得分:1)

~~用于将字符串转换为数字,就像!!用于将truthy / falsey值转换为布尔值一样。

var a = "4";
console.log(typeof a + " " + a); //string
console.log(typeof ~a + " " + a); //converts to number, but you get (a - 1)
console.log(typeof ~~a + " " + a);  // reverses the previous operation, keeping the number type

现在,正如您所知,在此操作中没有必要,因为在Javascript中,当您执行bitwise operations on strings they're first converted to numbers时,双倍波形变得多余。

我怀疑该片段的制作者的意图是你不能真正将十进制数字分类为奇数或偶数,所以他只是把它作为一个数字来去掉小数,{{1确实。