programing

비트 OR 0을 사용하여 숫자 바닥 설정

goodjava 2022. 12. 10. 10:50

비트 OR 0을 사용하여 숫자 바닥 설정

동료가 비트 단위로 플로트 숫자를 플로어하는 방법을 우연히 발견했습니다.

var a = 13.6 | 0; //a == 13

우리는 그것에 대해 이야기하고 몇 가지 궁금한 점이 있었다.

  • 어떻게 작동합니까?우리의 이론은 그러한 연산자를 사용하는 것이 정수에 숫자를 캐스팅하고, 따라서 소수 부분을 제거하는 것이었다.
  • 하는 보다 더 점이 요?Math.floor intended 、 ( ( ( 없음) (의도 없음)
  • 단점이 있나요?경우에 따라서는 효과가 없을 수도 있습니다.명확성은 명백합니다. 왜냐하면 우리가 알아내야 했기 때문입니다. 그리고 이 질문을 쓰고 있습니다.

감사해요.

어떻게 작동합니까?우리의 이론은 그러한 연산자를 사용하는 것이 정수에 숫자를 캐스팅하고, 따라서 소수 부분을 제거하는 것이었다.

없는 시프트를 한 모든 >>>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