Javascript는 배정도 64 비트 부동 숫자Number
로 나타냅니다 .
Math.floor
이것을 염두에두고 작동합니다.
비트 단위 연산은 부호 있는 32 비트 정수로 작동합니다 . 32 비트 부호있는 정수는 첫 번째 비트를 음의 부호로 사용하고 다른 31 비트는 숫자입니다. 이 때문에 허용되는 32 비트 부호있는 숫자의 최소 및 최대 수는 각각 -2,147,483,648 및 2147483647 (0x7FFFFFFFF)입니다.
따라서 할 때 | 0
본질적으로하는 것은 & 0xFFFFFFFF
입니다. 즉, 0x80000000 (2147483648) 이상으로 표시되는 숫자는 음수로 반환됩니다.
예를 들면 다음과 같습니다.
// Safe
(2147483647.5918 & 0xFFFFFFFF) === 2147483647
(2147483647 & 0xFFFFFFFF) === 2147483647
(200.59082098 & 0xFFFFFFFF) === 200
(0X7FFFFFFF & 0xFFFFFFFF) === 0X7FFFFFFF
// Unsafe
(2147483648 & 0xFFFFFFFF) === -2147483648
(-2147483649 & 0xFFFFFFFF) === 2147483647
(0x80000000 & 0xFFFFFFFF) === -2147483648
(3000000000.5 & 0xFFFFFFFF) === -1294967296
또한. 비트 단위 연산은 "바닥"이 아닙니다. 그들은 잘라 그들이 가장 가까운 반올림, 말과 동일하다, 0
. 당신이 음수 주위에 이동하면, Math.floor
원 아래로 잠시 비트는 반올림 시작 까지 .
앞에서 말했듯 Math.floor
이 64 비트 부동 숫자로 작동하기 때문에 더 안전합니다. 비트 단위 는 빠르지 만 32 비트 부호있는 범위로 제한됩니다.
요약:
- 에서 작업하는 경우 비트 단위는 동일하게 작동합니다
0 to 2147483647
.
- 에서 작업하는 경우 비트 단위는 1 숫자입니다
-2147483647 to 0
.
- 보다 작
-2147483648
거나 큰 숫자의 경우 비트 단위가 완전히 다릅니다 2147483647
.
당신이 만약 정말로 성능을 조정할 싶어 모두 사용
function floor(n) {
if (n >= 0 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
if (n > -0x80000000 && n < 0) {
return (n - 1) & 0xFFFFFFFF;
}
return Math.floor(n);
}
Math.trunc
비트 연산과 같은 작품 을 추가하기 만하면됩니다 . 그래서 당신은 이것을 할 수 있습니다 :
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}