IT Share you

'x << ~ y'는 JavaScript에서 무엇을 나타 냅니까?

shareyou 2021. 1. 7. 19:53
반응형

'x << ~ y'는 JavaScript에서 무엇을 나타 냅니까?


'x << ~ y'는 JavaScript에서 무엇을 나타 냅니까?

나는 비트 SHIFT연산이 이것을 한다는 것을 이해합니다 .

x << y AS x * 2 y

물결표 ~연산자는 다음을 수행합니다.

~x AS -(x+1)

따라서 다음과 같이 가정합니다.

5 << ~ 3 AS 5 * 2 -4 또는 5 * Math.pow (2, -4)

결과는 0.3125.

그러나 실행 5 << ~3하면 1342177280.

단계별 설명이란 무엇입니까? 이 작업 조합이 1342177280대신 어떻게 그리고 왜 발생 0.3125합니까?

(이 질문은 스택 오버플로 질문과 유사 비트 연산자가? 무엇 비트 단위에 대한 SHIFT연산자입니다.)


x << -n같은지 x << (32 - n)
~3 == -4그래서
5 << ~3=== 5 << (32 - 4)=== 5 << 281,342,177,280

정확하기 위해 X << -n은 X << (32 -n)과 동일하지 않습니다 ... 사실 더 간단하고 복잡합니다 ... 비트 시프트 연산자의 유효한 범위는 0 ~ 31 ... 비트 시프트 연산자의 RHS는 먼저 부호없는 32 비트 정수로 변환 된 다음 31 (hex 1f) (binary 11111) 로 마스킹됩니다.

                   3 = 00000000000000000000000000000011  
                  ~3 = 11111111111111111111111111111100
       0x1f (the mask) 00000000000000000000000000011111
                       --------------------------------
            ~3 & 0x1f  00000000000000000000000000011100 = 28

크기가 32보다 작 으면 위에 게시 한 것과 똑같습니다.

비트 연산은 32 비트 정수로 작동합니다. 음의 비트 시프트는 의미가 없으므로 양의 32 비트 정수로 래핑됩니다.

어떻게 << 연산자 작품

rhs는 부호없는 32 비트 정수로 변환됩니다-여기에 설명 된 대로 ToUInt32

ToUint32는 기본적으로 숫자를 받아서 모듈로 2 ^ 32를 반환합니다.


~동안 작업자는 항목의 비트 뒤집 <<는 비트 좌 시프트이다. 단계별로 바이너리에서 일어나는 일이 있습니다. 가장 왼쪽 비트가 1이면 음수를 나타내며 ,이 형식은 2를 칭찬합니다 .

3         // (00000000000000000000000000000011 => +3 in decimal)
// ~ flips the bits
~3        // (11111111111111111111111111111100 => -4 in decimal)
// The number 5 (..00101) shifted by left by -4 (-4 unsigned -> 28)
5         // (00000000000000000000000000000101 => +5 in decimal)
5 << -4   // (01010000000000000000000000000000 => +1342177280 in decimal)

마지막 줄에서는 비트가 다른쪽으로 이동하고 "회전"되어 큰 양수가됩니다. 사실 음수로 이동하는 것은 비트 회전 ( 오버플로 된 비트는 다른 쪽로 회전)과 유사하며 양수로 이동하면 이러한 동작이 발생하지 않습니다. 단점은 회전되지 않은 비트가 무시된다는 것입니다. 본질적으로 그것은 5 << -4하고있는 것과 동일하며 5 << (32 - 4)오히려 회전이 실제로 큰 변화 라는 것을 의미합니다 .

그 이유는 비트 시프트가 부호없는 5 비트 정수 이기 때문 입니다. 따라서 2의 이진수 -4 (11100)는 서명되지 않은 칭찬 입니다 28.


~ 3 (11100) (3 (00011)의 비트 보수)을 -4로 해석해서는 안되지만 부호없는 (음이 아닌) 5 비트 정수, 즉 28 = 16 + 8 + 4 (11100).

이것은 ECMAScript 표준에 설명되어 있습니다 ( 대부분의 현대 컴퓨터에서 NB , 양수 및 음수는 2의 보수 표현을 사용하여 메모리에 표시됨).

12.8.3 왼쪽 시프트 연산자 (<<)

참고 오른쪽 피연산자에서 지정한 양만큼 왼쪽 피연산자에서 비트 왼쪽 시프트 연산을 수행합니다.

12.8.3.1 런타임 의미론 : 평가

ShiftExpression : ShiftExpression << AdditiveExpression

  1. Let lref be the result of evaluating ShiftExpression.
  2. Let lval be GetValue(lref).
  3. ReturnIfAbrupt(lval).
  4. Let rref be the result of evaluating AdditiveExpression.
  5. Let rval be GetValue(rref).
  6. ReturnIfAbrupt(rval).
  7. Let lnum be ToInt32(lval).
  8. ReturnIfAbrupt(lnum).
  9. Let rnum be ToUint32(rval).
  10. ReturnIfAbrupt(rnum).
  11. Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
  12. Return the result of left shifting lnum by shiftCount bits. The result is a signed 32-bit integer.

~x will reverse the bit representation of your x value (32 bits signed value with two's complement).

x << y is the left shift operator (here left). Your mathematical interpretation is correct :)

You can read more about bitwise operations over here: bitwise operators in Javascript


5 << ~3 gives the same result as 5 << -4, you are right.

Important thing: shifting x << y really results into x * 2y, but it is not a direct usage, it is just a useful side-effect.
Moreover, if you have a negative y, it doesn't work in the same way.

ReferenceURL : https://stackoverflow.com/questions/34349350/what-does-x-y-represent-in-javascript

반응형