'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 << 28
인1,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
- Let lref be the result of evaluating ShiftExpression.
- Let lval be GetValue(lref).
- ReturnIfAbrupt(lval).
- Let rref be the result of evaluating AdditiveExpression.
- Let rval be GetValue(rref).
- ReturnIfAbrupt(rval).
- Let lnum be ToInt32(lval).
- ReturnIfAbrupt(lnum).
- Let rnum be ToUint32(rval).
- ReturnIfAbrupt(rnum).
- Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
- 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
'IT Share you' 카테고리의 다른 글
함수가 호출되지 않았는지 어떻게 테스트 할 수 있습니까? (0) | 2021.01.07 |
---|---|
AngularJs-SELECT의 ng-model (0) | 2021.01.07 |
Python의 argparse에서 동일한 옵션을 여러 번 사용 (0) | 2021.01.07 |
소품 변경시 React 컴포넌트 다시 렌더링 (0) | 2021.01.07 |
string.Format의 {{{0}}}은 무엇을합니까? (0) | 2021.01.07 |