산술연산자?

<aside> 📌 단순하다. +, -, /, *, %의 연산자들을 산술연산자라 부른다. 사용법도 간단하다. int c = a + b; int c = a - b; int c = a / b; int c = a * b; 단, 규칙이 있다.

  1. 0으로 나누면 안된다(무한대가 나온다).
  2. 연산을 통하여 할당할 자료형의 범위를 넘어서는 데이터를 넣으려고하면 오버플로우가 발생한다.

</aside>


비트연산자?

<aside> 📌 비트?라고 하면 전공자가 아니면 조금 익숙하지 않을 거다. 그래서 조금 설명하면 컴퓨터는 모든 정보를 메모리에 ***이진수***형태로 저장된다. 하나의 Bittrue/false, 1/0 처럼 2가지 상태만 표현할 수 있다. 즉, Bit라 하면 2가지의 상태를 나타내는 것이다. 그런데 중요한 것은 이러한 Bit들의 집합을 만들어 컴퓨터는 처리한다. int의 경우는 2^32로 총 가지 4,294,967,296 가지를 표현할 수 있다. 이걸 2로 나누면 2,147,483,648가지로 int형 자료의 범위 값이 된다. 물론 음수 양수 표현 때문에 2로 나눈거다. 그럼 간단해진다. 이러한 비트를 이용하여 연산을 하는 것이 비트 연산자다.

</aside>

<aside> 📌 비트연산자의 종류에는 &, |, ^, ~, <<, >>, >>> 차례대로 풀어보면 ***& :*** and와 같고 비트를 연산하여 같으면 1이 나온다. ***|* *:*** or와 같고 비트를 연산하여 둘중하나라도 1이 존재하면 1을 리턴한다. ***^* *:*** xor 연산으로 상호간의 관계가 다를때 1을 리턴한다. **~ *:*** not 연산으로 1을 0으로 0을 1로 바꿔 준다. ***>>, <<:*** 오른쪽으로 라고 생각하면 편하다. 그래서 규칙이 하나 존재한다. 왼쪽으로 밀때는 2^n, 오른쪽으로 밀때는 2^n을 나누면 간단하다. 정말 신기한 것은 음수가 유지된다. ***>>>, <<<:*** 이친구는 Unsigned 연산자다. 같은 쉬프트 연산이지만 부호를 신경안쓰고 민다.

</aside>

//특이점
public class Main {

    public static void main(String[] args) {
				// 미리 필자가 변환
				// 원리
				// 양수 2의 2진법 표현 00000010 하지만 int의 경우 32비트 표현 그래서 0을 앞에 붙여준거
				// 보수를 구함 11111101 + 1을 해줌 -> 11111110 그로면 -2가 표현됨 앞에는 전부 1붙여줌

        int 양 = 0b00000000000000000000000000000010; //2
        int 음 = 0b11111111111111111111111111111110; //-2 

        System.out.println(양); // 2
        System.out.println(음); // -2

        System.out.println(Integer.toBinaryString(음 & 0XFF)); // 11111110
        System.out.println(Integer.toBinaryString(~양  & 0XFF)); // 11111101
        System.out.println(~양); // -3 이렇게 나오는 이유는 '~'연산은 단순 0 -> 1, 1 -> 0으로만 변환
				// 그런데 왜 부호가 붙나?
				// 그 이유는 맨 앞자리 비트는 부호 용이다. 그래서 0 = 양수, 1 = 음수를 표현
        System.out.println(Integer.toBinaryString(양 & 0XFF)); // 10
        System.out.println(Integer.toBinaryString(~음 & 0XFF)); //1
        System.out.println(~음); // 1
    }
}

일반적으로 10을 2진수로 표현하면 8Bit 기준으로 00000010이 된다. 그럼 not 연산을 한다면
11111101(253)이 된다. 하지만 실제로 ~10한다면 111111111111111111111111 11110101이 나오고
결과 10진수 값은 -11이 된다. 이것의 원리는 양의 정수에서는 음수로 변환이 될때 1의 보수를 구한이후
1을 더해주기 때문이다. 그래서 실제로 변환한것과 콘솔에 찍어보는것이 다르게 출력되는 수 자체는 다르게
보이는 것이다.

CONSOLE RESULT
2
-2
11111110
11111101
-3
10
1
1

연산자(3) : 비트 연산자의 명확한 이해

보수 알아보기