비트연산에 대해 잘 이해가 안됩니다.

dltkddyd의 이미지

제 컴은 인텔칩입니다. 그래서 리틀엔디언 방식으로 비트를 저장하게 됩니다. 얼마전 답변을 보고 알게되었습니다. 그런데 비트연산을 하던 도중 몇 가지 의문이 들던데요.
10이라는 정수형 데이터가 비트구조로 저장될 때는, 다음과 같은 구조로 저장됩니다.

00001010 00000000 00000000 00000000

그리고 1이라는 정수와 비트연산을 한다고 하면, 1은 다음과 같은 구조로 돼있을 겁니다.

00000001 00000000 00000000 00000000

그리고 두 개를 &연산한 값을 출력합니다. 그리고 10이라는 값을 담고 있는 변수를 >>1 비트연산해서 그 변수에 값을 저장합니다. 32번 루프를 돌며 이러기를 반복하면, 저 구조를 봤을때 결과값은 다음과 같이 나와야 한다고 생각합니다.

0
2^24
0
2^24
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

그런데 결과는 이와 다르게 다음과 같이 출력됩니다.

0
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

물론 아래와 같은 결과를 기대한 것이지만, 리틀엔디안이라는 방식을 적용했을 때 나와야할 결과는 그 위의 것이라고 생각합니다. &연산과 shift 연산에 대해 제가 제대로 이해하지 못한 부분이 있어서 좀 헷갈리는 것 같은데, 어떤 생각이 잘못된 것인가요?

ifree의 이미지

리틀 엔디안 방식은 메모리에 데이타를 저장하는 방식으로 연산에 영향을 미치는 것은 아니에요.

의문이 많으신 것 같은데 프로그래밍 책 하나를 천천히 읽어 보시는게 좋을 듯.

익명 사용자의 이미지

"00001010 00000000 00000000 00000000"과 "00000001 00000000 00000000 00000000"의 & (AND 연산)을 하면 "00000000 00000000 00000000 00000000" (=0)이 나와야 합니다.
0에 shift 연산을 해봤자 0입니다....
정말 AND연산을 하신건가요??

beta의 이미지

원론적으로 님께서 생각하신게 맞습니다만, 코드로 구현하면서 뭔가 다른 요인이 있었지 않을까 생각합니다.

여담입니다만 님께서 작성하신 코드가 있었다면 원쾌한 답변들이 있었지 않았을까 생각해 봅니다.

  1 #include <stdio.h>
  2
  3 int main(void)
  4 {
  5     int i ;
  6     unsigned int var = 0x0A000000 ;
  7     unsigned int one = 0x01000000 ;
  8
  9     for(i = 0; i < 32; i++)
 10     {
 11         printf("%d ", var & one ) ;
 12         var >>= 1 ;
 13     }
 14
 15     return 0 ;
 16 }
 
0 16777216 0 16777216 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

발 담갔다. 이제 익숙해 지는길만이..

익명 사용자의 이미지

그러니까 a에 10을 저장하고 b에 1을 저장한 뒤, a를 계속 오른쪽으로 쉬프트 시켜가며 &연산하면 무슨 값이 나오는가 하는 질문이시죠?

결론부터 말씀드리자면
- 빅 엔디안 리틀 엔디안에 너무 현혹되지 마세요.
- x >> y와 x << y 연산은 무조건 정수 곱셈 2^y 이거나 정수 나눗셈 2^y 라고 생각하세요.
- 마지막으로, <<와 >>의 왼쪽 항에 음수가 들어가게 하지 마세요.

빅 엔디안과 리틀 엔디안은 내부적으로 수를 저장하는 방식입니다. 반면에 << >> 연산은 그냥 정수 곱하기 2이거나 정수 나누기 2입니다.

E1 << E2

- 모든 비트가 왼쪽으로 한칸씩 이동(그렇다고 sign 비트 값이 변하는건 아니다.)
- 공석이 된 비트는 0으로 채워진다.
- E1이 부호없는 정수형 타입이면 그 결과는 E1 * (2^E2)이고, 그 결과값이 해당 타입의 한계값을 초과하면 모듈로 연산(즉 %)에 의해 잘린다.
- E1이 부호있는 정수형이고 음수가 아닐 경우 역시 위와 마찬가지로 작동한다.
- 그 외의 경우는 정의되지 않았다(undefined).

E1 >> E2

- 그 결과값이 E1 / (2^E2) (정수형의 나눗셈이므로 그 결과값은 정수임)인 것과 아래의 조항을 제외하면 위와 같다.
- E1이 부호있는 정수형이고 음수일 경우, 그 결과값은 컴파일러가 결정한다(implementation-defined).

A & B
- 일반적인 산술 변환(arithmetic conversions)들이 피연산자들에 적용된다.
- bitwise AND 연산을 적용된다.
- 그 결과값은 산술변환 이후의 피연산자 A와 B의 각 비트들이 서로 일대일 대응할때만 적용된다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.