Inflearn brand logo image

인프런 커뮤니티 질문&답변

Qwe Asd님의 프로필 이미지
Qwe Asd

작성한 질문수

C# 프로그래밍 기초부터 실전 활용까지

비트 연산자

~ 연산자 이해가 안되요

해결된 질문

작성

·

78

0

비트연산자 ~이라는게 뭐하는건지 모르겠네요

~가 비트를 반전시키는 연산자인가요?

 

byte b =5;

b는 이진수로 0000 0101 이고

이걸 ~b로 하면 비트가 반전되니까

1111 1010 맨 앞자리가 1이라 음수

그럼 음수인 맨 앞 값을 제외하면

111 1010을 음수로 나타내서

10진수인 -122가 되어야 하는거 아닌가요?

1의보수로 다시바꾸고 다시 2의보수로 바꾸고 왜그런거죠?

그리고 맨 앞 비트가 0이면 양수고 1이면 음수라는것도 몰랐는데 저같은 완전 처음 입문자는 너무 헤맸네요.

 

답변 5

0

Kaburi님의 프로필 이미지
Kaburi
지식공유자

맨 앞자리가 부호를 나타내고 나머지를 10진수로 변환하면 정수 값이 반환 된다는 것은 반은 맞고 반은 틀린 말입니다.

 

양수인 경우는 부호 숫자 외 나머지 수를 10진수로 변환하면 그 값이 저희가 알고 있는 값이 맞습니다.

이진수 (0111) 로 예를 들어보도록 하겠습니다.

맨 앞 0 은 양수를 나타내고 나머지 111 => 4 + 2 + 1 = 7 이 됩니다.

하지만 음수인 경우는 다릅니다.

 

이진수 (1111) 로 예를 들어보면

맨 앞의 1은 음수를 나타내고 나머지 111 => 4 + 2 + 1 = 7 의 부호만 - 를 붙여 -7이 되는 것이 아닙니다.

먼저 1의 보수 후, 2의 보수를 진행하고 부호를 붙여야 음수를 구할 수 있습니다.

1의 보수 => 0000

2의 보수 => 0001 = 1 => 부호 추가 => -1 이 됩니다.

위 계산을 또 다른 방식으로 해석하면

1111 에서 

맨 앞자리(부호 -): 2^3 = -8
두번째 자리(+)   : 2^2 =  4
세번째 자리(+)   : 2^1 =  2
네번째 자리(+)   : 2^0 =  1
---------------------------
결과                  = -1

이 됩니다.

 

사람 입장에선 어려워 보일 수 있으나 컴퓨터 입장에선 훨씬 연산이 쉽고 효율적입니다.

 

컴퓨터 시스템이 2보수 방식으로 계산되는 뺄셈 예제를 보여드릴게요

다음은 5-3에 대한 예제입니다.

  0101    (5)
+ 1101    (-3, 2의 보수)
-------
 10010    (5비트가 되지만, 맨 앞(왼쪽) 1비트는 버림)

남은 4비트는 0010 => 결과는 2

 

따라서 다음과 같은 장점이 있습니다.

1. 덧셈과 뺄셈을 동일한 회로로 처리할 수 있음

  • 2의 보수 표현을 사용하면 덧셈과 뺄셈을 같은 방식(가산기)으로 계산할 수 있습니다.

  • 예를 들어, 5 + (-3)을 계산할 때, -3을 2의 보수로 바꿔서 5에 더하면 결과가 바로 나옵니다.

  • 별도의 뺄셈 회로가 필요 없습니다.


2. 0이 유일하게 표현됨

  • 1의 보수 방식(모든 비트를 반전)에서는 +0과 -0이 모두 존재(예: 0000=+0, 1111=-0)해서 혼란을 줍니다.

  • 2의 보수에서는 0을 한 번만 표현할 수 있습니다.


3. 오버플로우 처리가 쉽고, 수식이 단순함

  • 2의 보수에서는 오버플로우(자릿수 초과) 발생 시, 하위 비트만 남기면 결과가 올바릅니다.

  • 수식이 단순해서 컴퓨터 하드웨어 설계가 쉬워집니다.

0

Qwe Asd님의 프로필 이미지
Qwe Asd
질문자

아... 혹시 이런뜻인거 같은데.....

~ 연산 이라는게 비트상에서 서로 대척점에 있는 수를 나타낸다고 보면될까요

예를들면 10진수로 ~127에서128까지 쭉 줄세워 놓으면 맨왼쪽 -127의 숫자 맨오른쪽 128의 숫자가 서로 딱 대척점이고,

 

또 -126의 대척점은 127 입니다.( 서로 맨왼쪽에서 한칸 맨오른쪽에서 한칸씩 이동한것이기 때문에 )

 

이 수를 2진수로 컴퓨터에 입력되고 다시 출력될때는 10진수로 출력된다는 뜻으로 이해하면 되나요?

 

이것을 컴퓨터 연산은

1의보수 더했다가 음수로 저장하고 다시 1의보수 더했다가 또 1더했다가 이렇게 복잡하게 한다라는 걸로 이해하면 되는거죠?

 

그리고 AI는 질문을 4개올렸는데 전부 똑같은 답변만 하는거 같네 ...

0

Qwe Asd님의 프로필 이미지
Qwe Asd
질문자

아니면 그냥 2진수 b에 1 더하고 양수음수 바꿔주면 된다로 알면될까요?

 

왜 굳이 1의보수 더했다가 다시 1의보수 더했다가 또 1더했다가 이렇게 하는건가요?

0

Qwe Asd님의 프로필 이미지
Qwe Asd
질문자

정확하게 이해가 안 되네요 ~연산자의 의미를 모르겠네요 0000 0101에서 1의보수로 바꾼 후 다시 1의보수로 바꾸고 더하기 1을 하는이유가 뭐죠? 음수로 나타낼거면 그냥 맨앞에 0을1로 바꾸고 출력하면 되는거아닌가요?

~가 어떤 연산지인지 정확하게 의미를 모르겠습니다 답변이 영상에 나오는 내용과 똑같아 의문점이 해소되지 않네요.

검색해봐도 다 내용을 똑같이 알려주네요 ㅠ

0

안녕하세요, 인프런 AI 인턴입니다. Qwe Asd님.

비트 연산에 대한 질문을 주셨군요! C#에서 ~ 연산자는 비트 단위 반전(NOT 연산)을 수행합니다. 이는 각 비트의 0과 1을 서로 뒤바꾸는 것을 의미합니다. 여러분의 질문을 해결하고자 비트 연산에 대해 간단히 설명하겠습니다.

  1. 비트 반전(~) 연산자:

    • ~ 연산자는 각 비트를 뒤집습니다. 예를 들어 0000 0101이라는 바이너리 숫자는 ~0000 0101을 수행하면 1111 1010이 됩니다.
  2. 2의 보수 표현:

    • 컴퓨터는 음수를 2의 보수(binary complement)를 사용하여 표현합니다. 2의 보수는 모든 비트를 뒤집은 후 1을 더하는 방식으로 계산됩니다.
    • 예를 들어 1111 1010의 2의 보수를 계산할 때, 이미 ~ 연산으로 뒤집은 상태에서 1을 더하면 1111 1011이 됩니다. 이는 10진수로 -6을 나타냅니다.
  3. 접두어 이해:

    • 맨 앞 비트가 0이면 양수, 1이면 음수를 나타내는 것은 표준적인 2의 보수 표현 방식입니다. 이는 컴퓨터 구조에서 일반적으로 사용되는 방법입니다.
  4. 이해를 돕기 위한 추가 자료:

위 설명과 자료들이 이해에 도움이 되시기를 바랍니다. 혹시 질문에 대해 추가적으로 더 알고 싶으신 부분이나 다른 궁금한 점이 있으시면 언제든지 질문해 주세요!
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Qwe Asd님의 프로필 이미지
Qwe Asd

작성한 질문수

질문하기