비트 OR 0을 사용하여 숫자 바닥
내 동료가 비트 또는 다음을 사용하여 플로트 수를 플로팅하는 방법을 발견했습니다.
var a = 13.6 | 0; //a == 13
우리는 그것에 대해 이야기하고 몇 가지 궁금합니다.
- 어떻게 작동합니까? 우리의 이론은 그러한 연산자를 사용하면 숫자를 정수로 변환하여 소수 부분을 제거한다는 것입니다
- 그것보다 장점이
Math.floor
있습니까? 좀 더 빠를까요? (말장난이 아닙니다) - 단점이 있습니까? 경우에 따라 작동하지 않을 수 있습니까? 명확성을 이해해야했기 때문에 분명한 질문입니다. 글쎄, 저는이 질문을 작성하고 있습니다.
감사.
어떻게 작동합니까? 우리의 이론은 그러한 연산자를 사용하면 숫자를 정수로 변환하여 소수 부분을 제거한다는 것입니다
부호없는 오른쪽 시프트를 제외한 모든 비트 연산 >>>
은 부호있는 32 비트 정수에서 작동합니다. 따라서 비트 연산을 사용하면 부동 소수점을 정수로 변환합니다.
Math.floor를 수행하는 것보다 장점이 있습니까? 좀 더 빠를까요? (말장난이 아닙니다)
http://jsperf.com/or-vs-floor/2가 약간 더 빠른 것 같습니다
단점이 있습니까? 경우에 따라 작동하지 않을 수 있습니까? 명확성을 이해해야했기 때문에 분명한 질문입니다. 글쎄, 저는이 질문을 작성하고 있습니다.
- jsLint를 전달하지 않습니다.
- 32 비트 부호있는 정수만
- 홀수 비교 동작 :
Math.floor(NaN) === NaN
,(NaN | 0) === 0
이것은 바닥 이 아니라 절단 입니다. 하워드의 대답은 맞습니다. 그러나 Math.floor
음수와 관련하여 정확히 수행 해야하는 것을 추가하고 싶습니다 . 수학적으로, 그것은 바닥입니다.
위에서 설명한 경우 프로그래머는 잘라 내기 또는 소수점을 완전히 자르는 데 더 관심이있었습니다 . 비록 그들이 사용한 구문은 float를 int로 변환한다는 사실을 모호하게합니다.
ECMAScript를 6에서의 것과 동일 |0
하다 Math.trunc 내가 말을해야 종류의 :
소수를 제거하여 숫자의 정수 부분을 반환합니다. 인수가 양수인지 음수인지에 관계없이 점과 그 뒤에있는 숫자를 자릅니다.
Math.trunc(13.37) // 13
Math.trunc(42.84) // 42
Math.trunc(0.123) // 0
Math.trunc(-0.123) // -0
Math.trunc("-1.123")// -1
Math.trunc(NaN) // NaN
Math.trunc("foo") // NaN
Math.trunc() // NaN
첫 번째 요점이 맞습니다. 숫자는 정수로 캐스트되므로 10 진수가 제거됩니다. 참고, 그 해주십시오 Math.floor
음수에 적용 할 때 따라서 마이너스 무한대에 가까워 다음 정수로 라운드와는 다른 결과를 제공합니다.
사양에 따르면 정수로 변환됩니다.
lnum을 ToInt32 (lval)로 설정하십시오.
성능 : 이것은 전에 jsperf 에서 테스트되었습니다 .
참고 : 사양에 대한 연결 끊김 제거
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
Also. Bitwise operations don't "floor". They truncate, which is the same as saying, they round closest to 0
. Once you go around to negative numbers, Math.floor
rounds down while bitwise start rounding up.
As I said before, Math.floor
is safer because it operates with 64bit floating numbers. Bitwise is faster, yes, but limited to 32bit signed scope.
To summarize:
- Bitwise works the same if you work from
0 to 2147483647
. - Bitwise is 1 number off if you work from
-2147483647 to 0
. - Bitwise is completely different for numbers less than
-2147483648
and greater than2147483647
.
If you really want to tweak performance and use both:
function floor(n) {
if (n >= 0 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
if (n > -0x80000000 && n < 0) {
return (n - 1) & 0xFFFFFFFF;
}
return Math.floor(n);
}
Just to add Math.trunc
works like bitwise operations. So you can do this:
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}
참고URL : https://stackoverflow.com/questions/7487977/using-bitwise-or-0-to-floor-a-number
'Programming' 카테고리의 다른 글
스토리 보드에서 Modal과 Push segue의 차이점은 무엇입니까? (0) | 2020.05.21 |
---|---|
Node.js + Express.js 애플리케이션에 대한 오류 처리 원리? (0) | 2020.05.21 |
왜 (variable1 % variable2 == 0) 비효율적입니까? (0) | 2020.05.21 |
수입 명세서 앞의 밑줄은 무엇을 의미합니까? (0) | 2020.05.21 |
불안정한 연결에서 큰 프로젝트를 위해 git clone을 완료하는 방법은 무엇입니까? (0) | 2020.05.21 |