Endian 과 shift 연산과 관련한 질문입니다.

ksh098의 이미지

지금까지 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의 배수인지 아닌지 체크하는 정도는

속도에 영향을 거의 안미칩니다.

mithrandir의 이미지

int main()
{
        int a=0x020001 << 9;
        printf ("%X\n", a);
        return 0;
}

위 코드는 ppc(big-endian), i386에서 같은 결과로

4000200

를 뱉어냅니다. host byte order로 되어만 있다면 shift하는데는 문제가 없어보이는군요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

ksh098의 이미지

일단.. 제가 글을 좀 모호하게 쓴듯합니다.

보충해서 말씀드리면.. 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비트 4바이트)를 예를 들어야 정상인듯합니다만.

ksh098의 이미지

Anonymous wrote:
0x0123(16비트, 2바이트)이 아니라, 0x01020304(32비트 4바이트)를 예를 들어야 정상인듯합니다만.

아 그렇네요 ~ 수정했습니다. 다만 제가 0, 1,2,3 으로 예를
들었으니 0x00010203 이 되겠네요.

익명 사용자의 이미지

음 예전에도 비슷한 주제가 논의가 많이 되었던 걸로 기억해서리,
검색을 해봤습니다.
http://bbs.kldp.org/viewtopic.php?t=21086
이것 말고도 많은 토론이 있었습니다.

대체로는 비슷한 답변들의 모임입니다.
ntohl() 등 네트워크 바이트 오더링에서 많이 사용하기도 했던 것이지요.

만일, 리틀엔디안을 사용하는 목적시스템에서만 돌린다면, 해당 데이터를 변환해서 돌리는게 좋을듯 보입니다.
시간이 중요한 팩터라면 말입니다.

ksh098의 이미지

좀 더 검색을 해봐야겠네요.. 걸어주신 링크에 있는 건

제가 원하는거랑은 조금 차이가 있네요..

이게 한 바이트 내에서 끝나는게 아니라 다음바이트로 넘어가야할 일도

있고 하니.. 더 어려워지네요..

당연히 데이터를 3,2,1,0 형태로 쓰는 것이 좋겠지만..

지금 그래픽쪽 관련 라이브러리들이 int 단위가 아니라 char 단위로

접근해서 처리하는 부분들이 있어 그걸 다 뜯어고치기가 거의 불가능해서..

이런 방법이라도 선택하려 하는 것입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.