→) 연산자<aside>
📌 단순하다. +, -, /, *, %의 연산자들을 산술연산자라 부른다. 사용법도 간단하다.
int c = a + b;
int c = a - b;
int c = a / b;
int c = a * b;
단, 규칙이 있다.
</aside>
<aside>
📌 비트?라고 하면 전공자가 아니면 조금 익숙하지 않을 거다. 그래서 조금 설명하면 컴퓨터는 모든 정보를 메모리에 ***이진수***형태로 저장된다. 하나의 Bit는 true/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
보수 알아보기