• 프로그래머가 해야 할 일은 컴퓨터에게 명령을 내리는 것
    • 💻💭컴퓨터의 말로 명령을 해야 한다.
  • 컴퓨터는 어떤 언어를 쓸까?
    • 컴퓨터 언어에서 자연어의 문자(character)에 대응되는 개념이 바로 비트(bit)
    • 비트(bit)는 이진법(binary) + 숫자(digit)가 합쳐진 단어로, 메모리에 담긴 데이터를 나타내는 최소 단위라고 한다. 모든 데이터는 0, 1의 조합으로 구성되며 이때 0 또는 1이 하나의 비트가 된다.
    • 1개의 비트는 두 가지 상태(0 또는 1)를 나타낼 수 있으므로, n개의 비트로 표현할 수 있는 상태(경우의 수)는 2^n가지가 된다. 즉, 비트가 많을수록 표현할 수 있는 데이터 종류가 많아지는 것이다.

 

논리

  • 논리 연산(ogical operation)비트 연산(bitwise operation)
    • 다른 비트들이 표현하는 내용으로부터 새로운 비트를 만들어내는 동작을 논리 연산이라고 한다.
    • 하나 또는 둘 이상의 비트를 가지고 논리 연산을 진행하여 원하는 결과값을 도출해내는 동작을 비트 연산이라고 하며, 이때 사용되는 연산자를 비트 연산자(bitwise operator)라고 한다.
  • 대수(algebra - 代數, 수를 대신함)불리언 대수(Boolean algebra)
    • 대수란 수에 대한 연산 규칙의 집합으로서, 이름 그대로 '수를 대신하는' 기호 및 수들 사이의 연산 등을 의미한다. (사칙연산, 논리 연산 등 기초 대수학 정리를 이용한 식 표현 또는 방정식의 풀이 등)
    • 불리언 대수란 1800년대 영국 수학자 George Boole이 만들어낸 개념으로, 비트에 대해서도 사용할 수 있는 연산 규칙의 집합이다.
  • 불리언 연산자
    • 기본적인 연산: NOT, AND, OR
      • NOT : '논리적 반대'를 의미하며, 입력의 상태를 반대로 반전시킨다. (참 ↔ 거짓)
      • AND : 둘 이상의 비트에 작용하는데, 모든 비트가 참이어야 AND 연산의 결과도 참이다.
      • OR : 역시 둘 이상의 비트에 작용하며, 어느 한 비트라도 참이면 OR 연산의 결과도 참이다.
    • 합성 연산: XOR
      • XOR : Exclusive(배타적) OR인데 줄여서 XOR이라고 부른다. ('엑스오알'이라고 발음한다고 한다. hi~ 에이치아이~) 두 값이 달라야지만 XOR 연산 결과가 참이 되고, 두 값이 같으면 XOR 연산 결과가 거짓이 된다. 마치 기름과 물처럼 섞일 수 없는 운명 같네요 ..
  • 드 모르간의 법칙(De Morgan's Law)
    • 1800년대 영국 수학자 Augustus De Morgan이 알아낸, 불리언 대수에 적용할 수 있는 법칙이라고 한다. 
    • "①a AND b라는 연산은 ②NOT(NOT a OR NOT b)와 같다."
      • ab에 구체적인 값을 대입해서 생각해보면 편하다. 예를 들어 a, b 모두 참일 경우 ①번 연산 결과도 참이고 ②번 연산 결과도 참이 된다. 한편 ab 중 하나라도 거짓이면 ①번 연산 결과는 당연히 거짓이 되고 ②번 연산 결과도 거짓임을 알 수 있다.
    • 그래서 이걸 왜 쓰는건데요?.. 🙄
      • 복잡한 표현식을 가독성 좋은 표현식으로 변환할 수 있다는 장점도 있지만, 성능 측면에서도 장점이 있다고 한다. 연산을 연쇄적으로 사용하면 계산이 느려지는데, 드 모르간의 법칙을 알면 연산을 최소로 사용하여 성능을 올릴 수 있다.

 

숫자

비트를 사용해 논리를 표현하는 방법에 대해 알아보았으니, 이제는 수를 표현하는 방법을 알아보자.

  • 2진수 체계 
    • 10진수와 달리 10을 밑으로 하지 않고, 2를 밑으로 하는 수 체계
    • 10진수에서는 표현할 수 있는 값의 범위가 숫자(digit)의 개수로 정해지는데, 이와 마찬가지로 2진수에서는 표현할 수 있는 값의 범위가 비트의 개수로 정해진다.
      • 예를 들어서 5,028이라는 수를 2진수로 표현하고 싶으면 비트가 13개가 필요하게 된다.
  • LSB(least significant bit)MSB(most significant bit)
    • 이렇게 세 글자로 줄여부르는 것을 TLA(tree letter acronym)이라고 한다는데... 별다줄~
    • LSB(least significant bit)는 '가장 작은 유효 비트'를 의미하며, 2진수에서 가장 오른쪽의 비트를 가리킨다. 얘를 변경하면 2진수의 값이 가장 덜 변경되기 때문에... 즉 변경 전과 후의 값의 차이가 가장 작기 때문에~
    • MSB(most significant bit)는 '가장 큰 유효 비트'를 의미하며, 2진수에서 가장 왼쪽의 비트를 가리킨다. 얘를 변경하면 2진수의 값이 가장 크게 변하기 때문에~
  • 2진수 덧셈

  • 오버플로(overflow)언더플로(underflow)
    • 덧셈 결과가 우리가 사용할 수 있는 비트 개수보다 커지면 오버플로(overflow)가 발생한다. 오버플로란 MSB에서 올림이 발생했다는 의미인데, MSB는 2진수에서 가장 왼쪽에 있는 비트이며 얘의 왼쪽에는 더 이상 사용할 수 있는 비트가 없다.
      • ex) 4비트 덧셈 1001 + 1000 = 10001이 되어야 할 것 같지만 MSB 왼쪽에 사용할 수 있는 비트가 없어 결과가 0001이 됨.
    • 한편 MSB 위쪽에서 1을 빌려오는 경우를 언더플로(underflow)라고 하는데, 이는 음수를 표현하는 방법과 관련되어 있다.
    • 참고로 오버플로가 발생했는지 여부를 확인할 수 있는 방법이 있다. 컴퓨터에는 condition code register(조건 코드 레지스터 또는 상태 코드 레지스터)라는 게 있는데, 여기에는 몇 가지 "이상한" 정보를 담아둔다고 한다. 그리고 이 정보들 중 오버플로 비트(overflow bit)라는 이름의 비트 값을 보면 오버플로 발생 여부를 알 수 있다고 한다.
      조건 코드 레지스터(CCR)에 담기는 "이상한" 정보들과 그 정보들 중 하나인 overflow bit
  • 비트로 음수를 표현하려면?
    • 비트로 음수를 어떻게 표현할 수 있을까? 우리는 음수와 양수를 구별하기 위해 두 가지 부호(sign), 양부호(+)음부호(-)를 사용한다. 이 부호라는 값을 우리는 비트 하나를 통해 표현할 수 있다.
    • 비트로 음수를 표현하는 몇 가지 표현법들이 있는데 그 중 하나가 부호와 크기(sign and magnitude) 표현법이다. 이 표현법은 MSB를 부호를 표현하는 데 쓰고 그 외 나머지 비트는 수의 크기를 나타내는 데 쓴다. 이 방법을 쓰면 예를 들어 4비트가 있다치면 음수와 양수 모두 포함해서 총 15가지 수를 표현할 수 있다. 이때 중요한 건 표현할 수 있는 수가 16가지가 아니라 15가지라는 것인데, 이는 양수 0과 음수 0이 똑같은 0이라 얘네는 하나로 치기 때문이다. 부호와 크기 표현법은 일단 이 이유로도 잘 안쓰이기도 하고(왜냐하면 0을 표현하는 방법이 굳이 두 가지나 있어서 비용이 낭비되기 때문에!), 뿐만 아니라 XOR과 AND 연산을 통한 덧셈 계산도 할 수 없게 돼서 잘 안 쓰인다고 한다.
    • 그래서 결론적으로는 2진수로 양수/음수를 표현하기 위해 부호와 크기 표현법보다 더 효율적인 방법을 사용하게 되는데, 그게 바로 2의 보수 표현법(two's complement)이다.
      • 1의 보수 표현법(one's complement)의 경우 여전히 0을 두 가지 방식으로 표현한다는 문제점도 존재하고, 덧셈을 할 때 MSB에서 올림이 발생한 경우 LSB로 올림을 전달하는 순환 올림(end-around carry)을 사용하기 때문에 이 처리를 위한 추가적인 하드웨어가 필요하다는 비용적 측면에서의 문제점도 있어 현대 컴퓨터에서는 부호와 크기 표현법과 마찬가지로 1의 보수 표현법도 사용하지 않는다고 한다.
      • 2의 보수 표현법을 통해 부호가 있는 정수를 표현하는 방법은 아래와 같다.
        1. 어떤 수의 비트를 뒤집는다. 0은 1로, 1은 0으로 뒤집뒤집🍳
        2. 1을 추가한다. 즉 LSB에 1을 플러스
        3. 이때 만약 MSB에서 올림이 발생하면 MSB 왼쪽의 올림 비트는 걍 버려라.
      • 2의 보수 표현법에는 0의 중복 문제가 없다. 증명해보자.
        • 만약 0의 중복 문제가 있다면, 0을 표현하는 숫자가 2개가 될 것이다. 예를 들어 부호와 크기 표현법에서 0000과 1000 모두 0을 표현하는 것처럼~
        • 일단 비트 개수가 4개일 때 0은 당연히 0000이다. 2의 보수 표현법을 사용해서 이 0을 음수로 뒤집어보자. 일단 모든 비트를 뒤집으라 했으니 1111이 될 것이고, 여기에 1을 추가하면 올리고 올려서 [1]0000이 된다. MSB에서 올림이 발생했으니 1은 버리자. 짜잔~ 결국 0000이 됐다. 처음과 동일한 모습으로! 즉, 2의 보수 표현법에는 0을 표현하는 숫자가 1개 뿐임을 알 수 있다.

짜잔~

  • 2의 보수 표현법을 사용하면 이처럼 0의 중복 문제가 없기 때문에, 부호와 크기 표현법을 사용할 때보다 하나 더 많은 값을 표현할 수 있다. 비트가 4개일 땐 총 16개의 값(-8부터 +7까지)을, 비트가 8개일 땐 총 256개의 값(-128부터 127개까지)을.. 이런 식으로 비트의 개수에 따라 우리가 다룰 수 있는 수를 늘 본능적으로 계산할 수 있는 프로그래머가 될 것을 저자는 권장한다.....~!
  • 아무튼, 같은 수라도 표현법에 따라 나타내는 값이 달라지니까 그 부분도 신경을 써야 한다고 한다. 예를 들어 1111은 2의 보수에서는 -1을, 1의 보수에서는 -0을, 부호와 크기 표현법에서는 -7을 나타낸다.

 

 

 


<참고>

 

YES24

 

www.yes24.com

 

비트 (단위) - 위키백과, 우리 모두의 백과사전

비트(bit, binary digit)[1]는 하나의 비트는 0이나 1의 값을 가질 수 있고,[2] 각각은 참, 거짓 혹은 서로 배타적인 상태를 나타낸다. 바이트는 비트가 여러 개 모인 것으로, 원래는 크기가 명확히 정해

ko.wikipedia.org

 

비트연산 - 유니티로 알아보는 프로그래밍 개념

1. 비트(bit)란 ? 컴퓨터에서 정보를 나타내는 최소 단위. 8비트 = 1바이트. 2. 비트와 2진법의 관계 초기 컴퓨터는 전기가 통하냐(1), 안통하냐(0)를 판단해서 데이터를 처리하도록 설계되었기 때문

glikmakesworld.tistory.com

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

대수학 [정보통신기술용어해설]

 

www.ktword.co.kr

 

Condition Code Register

 

www.cs.qub.ac.uk

 

 

 

 

복사했습니다!