Endian 과 shift 연산과 관련한 질문입니다.
지금까지 bin endian 환경에서 돌아가는 프로그램을
little endian 환경에서 돌리게 되었는데요..
그러다보니 속도가 심하게 많이 저하되는 부분이 있어 혹시
해결책은 없나 싶어서 이렇게 질문 올립니다.
4 byte 를 읽어서 shift 연산을 취하여 다시 4byte 를
저장해야하는 것입니다. 즉...
00000011 00000111 11000000 10000000
( 작업전 )
이렇게 32 bit ( 4byte) 가 있다고 가정하고.. 이걸...
00000000 11000001 11110000 00100000
( right shift 2 )
요런식으로 바꾸는 거죠..
이게 big endian 일때는 그냥 바로 불러서 쓰면 되었으니
별 지장이 없었는데요..
little endian 일때는 작업전 내용을 읽으면
10000000 11000000 00000111 00000011
이렇게 뒤에 byte 부터 나오니까..
"((((t) >>24) & 0x000000ff) | (((t) >> 8 ) & 0x0000ff00) | (((t) << 8 ) & 0x00ff0000) | (((t) <<24) & 0xff000000))"
요런 알고리즘으로 바꿔주고.. 거기서 shift 연산을 하고 그걸
다시 같은 알고리즘으로 바꿔서 저장하는 형식으로
해야하네요..
대충 한번 계산하는데 9번의 shift 연산과 8 번의 and 연산,
6번의 or 연산 이 사용되었는데요..
이보다 더 빠르게 동작하는 방법이어야 합니다.
좋은 생각 있으신 분들 답변 부탁드리겠습니다.
참고로.. 8 bit 단위로 shift 하는 경우에는 반대로 하면
(right, left 를..) 저 위의 복잡한 연산을 안해도 되더군요.
한번 정해진 shift 값으로 상당히 많은 수의 연산을 하기 때문에..
한번 정도 shift 값이 8의 배수인지 아닌지 체크하는 정도는
속도에 영향을 거의 안미칩니다.
[code:1]int main(){
위 코드는 ppc(big-endian), i386에서 같은 결과로
를 뱉어냅니다. host byte order로 되어만 있다면 shift하는데는 문제가 없어보이는군요.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
음.. 그러니까...
일단.. 제가 글을 좀 모호하게 쓴듯합니다.
보충해서 말씀드리면.. char 단위로 읽었을때 bin endian 과
little endian 에서 같은 결과가 나야 합니다.
만일 int 단위로 읽었을때 little 과 big 에서 같은 결과가 난다면
char 단위로 읽으면 다른 결과가 있겠죠.. 예를 들어서..
0x00010203
으로 big/little 둘다 읽히려면
실제 메모리에는
big 의 경우...
주소 : 값
0x0 : 0x0
0x1 : 0x1
0x2 : 0x2
0x3 : 0x3
little 의 경우...
0x0 : 0x3
0x1 : 0x2
0x2 : 0x1
0x3 : 0x0
이렇게 써져야 할텐데요..
제가 원하는건 다같이 메모리에는
0x0 : 0x0
0x1 : 0x1
0x2 : 0x2
0x3 : 0x3
처럼 써지도록 하는 방법입니다...
0x0123(16비트, 2바이트)이 아니라, 0x01020304(32비트
0x0123(16비트, 2바이트)이 아니라, 0x01020304(32비트 4바이트)를 예를 들어야 정상인듯합니다만.
[quote="Anonymous"]0x0123(16비트, 2바이트)이 아
아 그렇네요 ~ 수정했습니다. 다만 제가 0, 1,2,3 으로 예를
들었으니 0x00010203 이 되겠네요.
음 예전에도 비슷한 주제가 논의가 많이 되었던 걸로 기억해서리,검색을
음 예전에도 비슷한 주제가 논의가 많이 되었던 걸로 기억해서리,
검색을 해봤습니다.
http://bbs.kldp.org/viewtopic.php?t=21086
이것 말고도 많은 토론이 있었습니다.
대체로는 비슷한 답변들의 모임입니다.
ntohl() 등 네트워크 바이트 오더링에서 많이 사용하기도 했던 것이지요.
만일, 리틀엔디안을 사용하는 목적시스템에서만 돌린다면, 해당 데이터를 변환해서 돌리는게 좋을듯 보입니다.
시간이 중요한 팩터라면 말입니다.
답변감사합니다..
좀 더 검색을 해봐야겠네요.. 걸어주신 링크에 있는 건
제가 원하는거랑은 조금 차이가 있네요..
이게 한 바이트 내에서 끝나는게 아니라 다음바이트로 넘어가야할 일도
있고 하니.. 더 어려워지네요..
당연히 데이터를 3,2,1,0 형태로 쓰는 것이 좋겠지만..
지금 그래픽쪽 관련 라이브러리들이 int 단위가 아니라 char 단위로
접근해서 처리하는 부분들이 있어 그걸 다 뜯어고치기가 거의 불가능해서..
이런 방법이라도 선택하려 하는 것입니다.
댓글 달기