Как x | 0 определяет число в JavaScript - PullRequest
10 голосов
/ 29 января 2012

В принятом ответе на мой предыдущий вопрос ( Какой самый быстрый способ генерировать случайное целое число в javascript? ) мне было интересно, как число теряет свои десятичные дроби через символ |.

Например:

var x = 5.12042;
x = x|0;

Как эта цифра может быть равна 5?

Еще несколько примеров:

console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 );   // 9

Ответы [ 3 ]

13 голосов
/ 29 января 2012

Поскольку, согласно спецификациям ECMAScript, операторы побитовых операторов вызывают ToInt32 для каждого выражения, которое должно быть оценено.

См. 11.10 Бинарные побитовые операторы :

Производство A : A @B, где @ является одним из побитовых операторов в вышеприведенных производствах, оценивается следующим образом:

  1. Оценка A.

  2. Звоните GetValue(Result(1)).

  3. Оцените B.

  4. Звоните GetValue(Result(3)).

  5. Звоните ToInt32(Result(2)).

  6. Звоните ToInt32(Result(4)).

  7. Примените побитовый оператор @ к Result(5) и Result(6). Результатом является 32-разрядное целое число со знаком .

  8. Возврат Result(7).

5 голосов
/ 29 января 2012

Битовые операторы преобразуют свои аргументы в целые числа (см. http://es5.github.com/#x9.5). Большинство языков Я знаю не поддерживают этот тип конвертации:

    $ python -c "1.0|0"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: unsupported operand type(s) for |: 'float' and 'int'

    $ ruby -e '1.0|0'
    -e:1:in `': undefined method `|' for 1.0:Float (NoMethodError)

    $ echo "int main(){1.0|0;}" | gcc -xc -
    : In function ‘main’:
    :1: error: invalid operands to binary | (have ‘double’ and ‘int’)

2 голосов
/ 29 января 2012

При выполнении floor, хотя было бы возможно преобразовать аргумент в целое число, это не то, что делает большинство языков, потому что исходный тип является числом с плавающей запятой.Чтобы сохранить тип данных, нужно перейти к exponent цифрам в mantissa и обнулить оставшиеся биты.

Если вам интересно, вы можете взглянуть на IEEEspec для чисел с плавающей запятой.

...