2012-01-28 2 views
9

В принятом ответе на мой предыдущий вопрос (What is the fastest way to generate a random integer in javascript?), мне было интересно, как число теряет десятичные знаки через символ | .Как x | 0 нарисовать номер в JavaScript?

Например:

var x = 5.12042; 
x = x|0; 

Как это пол номер в 5?

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

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

Вы должны знать, что использование побитовых операторов ограничит вас 32-разрядными целыми знаками. '((Math.pow (2,32)/2) -1) | 0; // 2147483647 'Удалите' -1', и вы не получите желаемый результат. '((Math.pow (2,32)/2)) | 0; // -2147483648' –

+0

Интересно. Вероятно, это причина, по которой эта функция немного быстрее, чем функция 'Math.floor (x)'. http://jsperf.com/floor-or-or – user824294

+1

Это не на самом деле «пол», попробуйте с '-1.23', чтобы увидеть, что произойдет – ajax333221

ответ

13

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

См 11.10 Binary Bitwise Operators:

производства 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

Битовые операторы преобразуют свои аргументы в целые числа (см 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’) 

+4

' s/Most (. *?) do/Strongly typed \ 1 вообще не делают/'(Это, однако, очень зависит от языка). –

2

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

Лучший способ сделать это при сохранении типа данных - перейти к exponent цифрам в mantissa и обнулить оставшиеся биты.

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