비트 시프트는 엔디안성에 따라 달라지는가?
만약 내가 그 번호를 가지고 있다고 가정하자.'numb'=1025 [00000000 00000000 00000100 00000001]
표현된:
Little-Endian Machine:
00000001 00000100 00000000 00000000
Big-Endian Machine의 경우:
00000000 00000000 00000100 00000001
이제 10비트에 Left Shift를 적용하면(예: 무감각 <<= 10)) 다음과 같이 해야 한다.
[A] Little-Endian Machine:
GDB에서 내가 알아차렸듯이, 리틀 엔디안은 3단계로 Left Shift를 한다. [나는 프로세싱만 더 잘 이해하기 위한 '3단계'를 보여주었다].
빅 엔디안 협약의 반대 의견을 다루십시오.
00000000 00000000 00000100 00000001
좌측 시프트 적용:
00000000 00010000 00000100 00000000
결과를 리틀 엔디안으로 다시 표시:
00000000 00000100 00010000 00000000
[B] 빅 엔디안 머신에서:
00000000 00010000 00000100 00000000
내 질문은:
Little Endian Convention에 Left Shift를 직접 적용하면 다음과 같은 효과를 얻을 수 있다.
numb
:
00000001 00000100 00000000 00000000
numb << 10
:
00010000 00000000 00000000 00000000
그러나 실제로 이 기술은 다음과 같은 이점을 제공한다.
00000000 00000100 00010000 00000000
두 번째 결과만을 달성하기 위해 나는 위에서 세 가지 가상의 단계를 보여 주었다.
위의 두 결과가 다른 이유를 설명하십시오.의의 결 결과numb << 10
예상한 결과와 다르다.
엔디안성은 값이 메모리에 저장되는 방식이다.Endianness와 관계없이 프로세서에 로드되면, 비트 시프트 명령이 프로세서 레지스터의 값으로 작동된다.따라서 메모리에서 프로세서로 로딩하는 것은 빅 엔디안으로 변환하는 것과 동등한 것으로, 다음에 시프팅 작업이 오고 그 다음에 새로운 값이 다시 메모리에 저장되는데, 여기서 작은 엔디안 바이트 순서가 다시 효력을 발휘하게 된다.
업데이트, @jw:On PowerPC 벡터 이동과 회전은 엔디안 민감하다.벡터 레지스터에서 값을 가질 수 있으며, 시프트는 리틀엔디안과 빅엔디안에서 다른 결과를 만들어 낼 것이다.
아니, 비트시프트는 C의 다른 부분과 마찬가지로 표현이 아닌 가치의 관점에서 정의된다.좌회전 1은 곱하기 2는 오른쪽 편차 2는 나누기.(비트와이즈 작업을 사용할 때는 항상 서명 상태에 주의하십시오.서명되지 않은 적분형에는 모든 것이 가장 잘 정의되어 있다.)
비록 받아들여진 답은 Endianess가 기억의 관점에서 본 개념이라는 것을 지적한다.그러나 나는 그것이 그 질문에 직접적으로 대답한다고 생각하지 않는다.
어떤 답변은 비트 연산 기능이 엔디안스에 의존하지 않으며 프로세서가 바이트를 다른 방식으로 나타낼 수 있다는 것을 말해준다.어쨌든, 그것은 내성적인 것이 추상화되는 것에 대해 이야기하고 있다.
하지만 우리가 예를 들어, 종이에 약간 현명하게 계산을 할 때, 애초에 종말을 말할 필요가 없는가?대부분의 경우 우리는 내성적인 것을 암묵적으로 선택한다.
예를 들어, 다음과 같은 코드 라인이 있다고 가정해 보십시오.
0x1F & 0xEF
어떻게 손으로, 종이에다 결과를 계산하시겠습니까?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
그래서 우리는 빅 엔디안 형식을 사용해서 계산을 해봅시다.리틀 엔디안을 사용하여 같은 결과를 계산하고 얻을 수도 있다.
Btw, 우리가 숫자를 코드로 쓸 때, 나는 그것이 빅 엔디안 형식과 같다고 생각한다. 123456
또는0x1F
대부분의 중요한 숫자는 왼쪽에서 시작된다.
다시 말하지만, 우리가 어떤 값의 이진 형식을 종이에 쓰자마자, 나는 우리가 이미 Endianess를 선택했다고 생각하고 우리는 기억에서 그것을 보는 것처럼 그 값을 보고 있다.
그럼 다시 질문으로 돌아가서, 교대조 작전<<
LSB(최소값 바이트)에서 MSB(최소값 바이트)로 이동하는 것으로 간주해야 한다.
그 다음 질문의 예에 대해 다음과 같이 설명하십시오.
numb=1025
리틀 엔디안
LSB 00000001 00000100 00000000 00000000 MSB
그렇게<< 10
되지요10bit
LSB에서 MSB로 전환.
비교 및<< 10
리틀 엔디안 에에 에에 작별:
MSB LSB
00000000 00000000 00000100 00000001 numb(1025)
00000000 00010000 00000100 00000000 << 10
LSB MSB
00000000 00000100 00010000 00000000 numb(1025) << 10, and put in a Little Endian Format
LSB MSB
00000001 00000100 00000000 00000000 numb(1205) in Little Endian format
00000010 00001000 00000000 00000000 << 1
00000100 00010000 00000000 00000000 << 2
00001000 00100000 00000000 00000000 << 3
00010000 01000000 00000000 00000000 << 4
00100000 10000000 00000000 00000000 << 5
01000000 00000000 00000001 00000000 << 6
10000000 00000000 00000010 00000000 << 7
00000000 00000001 00000100 00000000 << 8
00000000 00000010 00001000 00000000 << 9
00000000 00000100 00010000 00000000 << 10 (check this final result!)
와우! OP에서 설명한 대로 기대되는 결과가 나왔어!
OP가 기대한 결과를 얻지 못한 문제는 다음과 같다.
LSB에서 MSB로 전환하지 않은 것으로 보인다.
리틀 엔디안 형식으로 비트를 이동할 때는 다음과 같은 것을 깨달아야 한다.
LSB 10000000 00000000 MSB << 1
는
LSB 00000000 00000001 MSB
, 아니다. LSB 01000000 00000000 MSB
왜냐하면 각 개인마다8bits
, 우리는 실제로 그것을 쓰고 있다.MSB 00000000 LSB
빅 엔디안 형식.
그래서 마치
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
요약하면:
비트 연산은 블라블라블라(blabla)를 추상화한다고는 하지만 손으로 비트 연산을 계산할 때 종이에 이진 형식을 적으면서 우리가 사용하고 있는 엔디안스가 무엇인지 알아야 한다.또한 우리는 모든 운영자들이 동일한 엔디안을 사용하는지 확인할 필요가 있다.
OP가 예상한 결과를 얻지 못한 것은 그가 시프트를 잘못했기 때문이다.
어떤 시프트 명령이 고차 비트를 먼저 이동시키든지 간에 좌측 시프트로 간주된다.저차 비트를 먼저 이동시키는 시프트 명령이 올바른 시프트로 간주된다.그런 의미에서 의 행동.>>
그리고<<
을 위해unsigned
숫자는 엔디안성에 의존하지 않을 것이다.
컴퓨터는 우리가 하는 방식으로 숫자를 기록하지 않는다.그 가치는 그저 변화할 뿐이다.바이트 단위로 보자고 고집한다면(컴퓨터가 그렇게 하는 것은 아니지만) 리틀엔디안 기계에서는 첫 번째 바이트가 좌회전하고, 초과 비트는 두 번째 바이트로 들어가는 등이라고 말할 수 있을 것이다.
(그런데, 리틀엔디안은 위에 주소가 더 높은, 수평이 아닌 수직으로 바이트를 쓰면 더 이치에 맞는다.메모리 맵 다이어그램이 일반적으로 그려지는 방식이 그것이다.)
참조URL: https://stackoverflow.com/questions/7184789/does-bit-shift-depend-on-endianness
'programing' 카테고리의 다른 글
C, C++, C#에서 보이드는 무엇을 의미하는가? (0) | 2022.04.15 |
---|---|
Vuex Store는 콘솔 또는 클라이언트 브라우저에서 액세스할 수 있는가? (0) | 2022.04.15 |
20 랜덤 바이트 배열을 만드는 방법 (0) | 2022.04.14 |
Java에서 플로트 및 이중 데이터 유형 (0) | 2022.04.14 |
버튼을 클릭하면 Vuejs가 url로 리디렉션됨 (0) | 2022.04.14 |