비트 OR 0을 사용하여 숫자 바닥 설정
동료가 비트 단위로 플로트 숫자를 플로어하는 방법을 우연히 발견했습니다.
var a = 13.6 | 0; //a == 13
우리는 그것에 대해 이야기하고 몇 가지 궁금한 점이 있었다.
- 어떻게 작동합니까?우리의 이론은 그러한 연산자를 사용하는 것이 정수에 숫자를 캐스팅하고, 따라서 소수 부분을 제거하는 것이었다.
- 하는 보다 더 점이 요?
Math.floorintended 、 ( ( ( 없음) (의도 없음) - 단점이 있나요?경우에 따라서는 효과가 없을 수도 있습니다.명확성은 명백합니다. 왜냐하면 우리가 알아내야 했기 때문입니다. 그리고 이 질문을 쓰고 있습니다.
감사해요.
어떻게 작동합니까?우리의 이론은 그러한 연산자를 사용하는 것이 정수에 숫자를 캐스팅하고, 따라서 소수 부분을 제거하는 것이었다.
없는 시프트를 한 모든 >>>32번입니다.따라서 비트 연산을 사용하면 플로트가 정수로 변환됩니다.
그것이 Math.floor를 하는 것보다 더 좋은 점이 있나요?조금 더 빠른 거 아니야?(의도 없음)
http://jsperf.com/or-vs-floor/2가 조금 빠른 것 같습니다.
단점이 있나요?경우에 따라서는 효과가 없을 수도 있습니다.명확성은 명백합니다. 왜냐하면 우리가 알아내야 했기 때문입니다. 그리고 이 질문을 쓰고 있습니다.
- jsLint를 통과하지 않습니다.
- 32비트 부호 있는 정수만
- 비교 동작: " " " " "
Math.floor(NaN) === NaN와 동시에 , 「」를 참조해 주세요.(NaN | 0) === 0
이것은 플로어링이 아니라 절단입니다.하워드의 답변은 어느 정도 옳습니다. 하지만 제가 덧붙이고 싶은 것은Math.floor음수에 대해 정확히 해야 할 일을 하고 있습니다.수학적으로 바닥이란 그런 것이다.
위에서 설명한 경우 프로그래머는 소수점 자르기 또는 완전히 잘라내는 데 더 관심이 있었습니다.다만, 사용한 구문은 플로트를 int로 변환하고 있다는 사실을 애매하게 하고 있습니다.
6에서 ECMAScript 6은 ECMAScript 6에 한다.|0Math.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
는 Javascript를 나타냅니다.NumberDouble Precision 64비트 부동 수치로 지정합니다.
Math.floor이 점을 염두에 두고 동작합니다.
비트 단위 연산은 32비트 부호 있는 정수로 동작합니다.32비트 부호 있는 정수는 첫 번째 비트를 음의 기호로 사용하고 나머지 31비트는 숫자입니다.따라서 32비트 서명된 최소 수와 최대 수는 각각 -2,147,483,648 및 2147483647(0x7FFFFFFFF)입니다.
할 때| 0 기본적으로 하고 것은...& 0xFFFFFFFF
예를 들어 다음과 같습니다.
// 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.floor64비트 부동소수로 동작하기 때문에 안전합니다.Bitwise가 더 빠르지만 32비트 서명 범위로 제한됩니다.
요약:
- 는 Bitwise에서 합니다.
0 to 2147483647. - 입니다.
-2147483647 to 0. - 는 하다, 하다, 하다, 하다, 하다, 하다보다 숫자에 .
-2147483648크다2147483647.
성능을 조정하고 둘 다 사용하는 경우:
function floor(n) {
if (n >= 0 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
if (n > -0x80000000 && n < 0) {
const bitFloored = n & 0xFFFFFFFF;
if (bitFloored === n) return n;
return bitFloored - 1;
}
return Math.floor(n);
}
말하면, ★★★★★★★★★★★★★★★★★★★★★★」Math.trunc비트 연산과 같이 동작합니다.이치노
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}
당신의 첫 번째 지적은 옳습니다.숫자는 정수로 캐스트되므로 십진수는 삭제됩니다.해 주세요, 그 세주주주 please please please please please please please please 。Math.floor는 음의 무한대로 향하는 다음 정수로 반올림되므로 음수에 적용하면 다른 결과를 얻을 수 있습니다.
사양에는 정수로 변환되어 있습니다.
lnum을 ToInt32(lval)로 합니다.
퍼포먼스: 이것은 이전에 jsperf에서 테스트된 적이 있습니다.
메모: 사양에 대한 데드링크는 삭제되었습니다.
var myNegInt = -1 * Math.pow(2, 32);
var myFloat = 0.010203040506070809;
var my64BitFloat = myNegInt - myFloat;
var trunc1 = my64BitFloat | 0;
var trunc2 = ~~my64BitFloat;
var trunc3 = my64BitFloat ^ 0;
var trunc4 = my64BitFloat - my64BitFloat % 1;
var trunc5 = parseInt(my64BitFloat);
var trunc6 = Math.floor(my64BitFloat);
console.info(my64BitFloat);
console.info(trunc1);
console.info(trunc2);
console.info(trunc3);
console.info(trunc4);
console.info(trunc5);
console.info(trunc6);
IMO: "어떻게 작동합니까?" "Math.floor보다 장점이 있습니까?" "단점이 있습니까?"라는 질문은 "이 용도로 사용하는 것이 논리적인가요?"에 비해 창백합니다.
코드를 잘 쓰기 전에 이걸 실행해보는 게 좋을 것 같아요.내 조언이야, 그냥 가, 여긴 볼 게 없어.몇 가지 작업을 저장하기 위해 비트를 사용하는 것은 일반적으로 코드 아키텍처가 작동해야 한다는 것을 의미합니다.가끔 작동하는 한, 정지된 시계는 하루에 두 번 정확하기 때문에 유용하지 않습니다.이러한 연산자에는 용도가 있지만, 이 컨텍스트에서는 사용할 수 없습니다.
언급URL : https://stackoverflow.com/questions/7487977/using-bitwise-or-0-to-floor-a-number
'programing' 카테고리의 다른 글
| Larabel 5.1에서 원시 쿼리를 실행하는 방법 (0) | 2022.12.10 |
|---|---|
| JavaScript를 사용하여 현재 URL을 가져오시겠습니까? (0) | 2022.12.10 |
| 함수 내부에서 변수를 수정해도 변경되지 않는 이유는 무엇입니까? - 비동기 코드 참조 (0) | 2022.12.10 |
| MySQL 테이블 업데이트 및 중복 항목 무시 (0) | 2022.12.10 |
| 배열에 요소가 있는지 확인합니다. (0) | 2022.12.10 |