일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Math.random()
- JAVA프로그래밍
- 객체지향
- 멤버변수의초기화
- random클래스
- 난수
- 2진법의음수표현
- 멤버메소드
- 2진법음수
- 멤버변수
- random()
- 의사난수
- 자바
- 변수의초기화
- 멤버필드
- 난수발생
- 2의보수
- 컴퓨터구조
- 2진법음수표현
- 객체지향언어
- new연산자
- 클래스
- 부호절댓값
- 자바프로그래밍
- static
- 전역변수
- java
- 지역변수
- 클래스멤버
- 1의보수
- Today
- Total
주인장의 프로그래밍 개발 공부방
[Chapter 2 연산자] 7. 비트 연산자 - 비트논리 연산자 본문
우리가 비트전환 연산자를 시작으로 비트 연산자에 대해서 알아보고 있다.
이번에 알아볼 연산자는 바로 논리 연산자와 연관이 있는
비트논리 연산자이다.
목표 : 비트논리 연산자가 무엇인지 알고 어떻게 연산을 하는지 정확하게 이해한다.
1. 논리 연산자
우리가 비트논리 연산자를 알아보기 전에 일단 논리 연산자를 다시 한 번 상기시킬 필요가 있을 것이다.
논리 AND 연산자
논리 OR 연산자
우리가 이미 만났던 논리 연산자를 다시 한 번 살펴보자면
논리 AND 연산자는 둘 다 true여야만 결과가 true가 되고
둘 중 하나라도 false가 있다면 결과는 false가 된다.
논리 OR 연산자는 둘 중 하나만 true가 있어도 결과가 true가 되고
둘 다 false여야만 결과가 false가 된다는 것을
우리는 이미 배웠고 알고 있다.
비트논리 연산자도 크게 다르지가 않다.
개념 자체는 똑같다고 생각하고 넘어가도 무방하다고 생각한다.
2. &, |
비트논리 연산자와 논리 연산자의 차이점이라면
일단 기호의 갯수 차이가 있겠다.
논리 연산자에서는 같은 기호를 2개씩 붙여서 표기를 했는데
비트논리 연산자는 기호를 하나씩만 써서 표기를 한다.
즉 논리 AND 연산자는 &&이지만
비트논리 AND 연산자는 &인 것이다.
OR 연산자도 동일하다.
그리고 비트논리 연산자의 특징이라면 결과가 true, false가 아니라
1과 0이라는 점이다.
이는 비트 연산자이기 때문에 비트를 가지고 연산을 하는 녀석들이기 때문이다.
하지만 역시 크게 다른 점은 없다
1은 true와 같고 0은 false와 같기 때문이다.
비트논리 AND 연산자
비트논리 OR 연산자
위의 표들을 보면 논리 연산자와 크게 다를 것이 없는 것을 느낄 수가 있을 것이다.
다만 결과가 1과 0으로 바뀐 것 뿐이지.
이해하는데 어려움은 전혀 없을 것이라 생각한다.
비트논리 AND 연산자(&)는 둘 다 1이어야만 결과가 1이 되고
둘 중 하나라도 0이 있다면 결과는 0이 된다.
비트논리 OR 연산자(|)는 둘 중 하나라도 1이 있다면 결과는 1이 되고
둘 다 0이어야만 결과가 0이 된다.
그렇다면 이제 연산자를 사용해서 계산을 해보자.
10진수의 정수 2개를 사용해서 연산을 해볼텐데
3과 5를 이용해서 예시를 만들어보자.
1) &
먼저 & 연산자을 살펴보자.
3 & 5
라는 식이 있다면 과연 결과는 어떻게 출력이 될까?
정답은 1이 나오게 된다.
정말 뜬금없을 수도 있지만 이 식의 결과는 1이 출력이 된다.
그렇다면 계산과정을 한 번 살펴보자.
먼저 우리는 비트논리 연산자를 사용하려면
피연산자를 2진수, 즉 비트로 변환할 필요가 있다는 것을 눈치채야 한다.
3을 2진수로 변환하면
0 0 0 0 0 0 1 1(2)
이 되고 5를 2진수로 변환하면
0 0 0 0 0 1 0 1(2)
이 된다는 것을 알 수 있다.
이 2개의 2진수를 사칙연산하듯이 자릿 수에 맞춰서
논리 연산을 하면 다음과 같이 된다.
결과는
0 0 0 0 0 0 0 0 1(2)
가 되고 이를 10진수로 변환하면 1이 나오게 된다.
2) |
다음으로 |연산자를 살펴보자.
동일하게 3과 5로 연산을 진행할텐데
3 | 5
라는 식이 있다면 일단 먼저 2진수로 변환을 할 것이고
앞서 변환한 값들을 가져와 연산을 하면 다음과 같이 진행된다.
역시 자릿 수에 맞춰서 연산을 하면 결과는
0 0 0 0 0 1 1 1(2)
가 나오는데 이를 10진수로 변환하면 7이 된다.
&연산자와 |연산자는 정말 예상할 수 없는 값을 출력하는 것을 알 수 있었다.
이는 2진수로 변환한 값을 가지고 연산하기 때문이다.
여기까지는 사실 어려운 부분이 크게 없을 것이라고 생각한다.
그런데 문제는 다음에 나오는 녀석이다.
3. ^
뜬금없이 ^가 뭐냐고 물을 것이다.
이모티콘인가 하면서 비꼬는 사람도 있을텐데
이 녀석의 이름은 Exclusive OR(배타적 논리합)이라고 부른다.
도대체 무슨 말인지 이해가 안될 수도 있는데
일단 어떤 녀석인지 한 번 살펴보자.
배타적 논리합 XOR
배타적 논리합은 XOR이라고 쓰기도 하고
기호는 ^로 표기한다.
위의 표를 잘 살펴보면 다른 논리 연산자와 다른 점을 하나 발견할 수가 있을 것이다.
바로 둘 다 1일 때 결과는 0이라는 부분이다.
즉, XOR 연산자는 같은 값이라면 무조건 결과는 0이고
다른 값이라면 무조건 결과는 1이 된다.
그래서 둘 다 1이어도 결과는 0이 되는 것이다.
무슨 이렇게 해괴망측한 녀석이 다 있냐고 하겠지만
엄연히 논리기호 중 하나이고
꽤나 유용하게 쓰이는 부분이 있기 때문에 기억하고 있는 것이 좋다고 생각한다.
그렇다면 실제로 연산을 한 번 해보자.
역시 3과 5를 이용하는데
3 ^ 5
라는 식이 있다면 역시 2진수로 변환을 해 자릿 수에 맞춰 연산을 한다.
다시 한 번 말하지만 XOR은 같으면 0, 다르면 1이기 때문에
위와 같이 연산이 되고 3 ^ 5의 결과는
0 0 0 0 0 1 1 0(2)
이 나온다. 이를 10진수로 변환하면 6이 나오는 것을 알 수 있다.
4. 마무리
비트논리 연산자는 우리가 이전에 만났던 논리 연산자들과 크게 다른 점이 없다.
다른 부분이 있다면 결과값이 true, false가 아니라
0과 1이라는 점인데
비트논리 AND 연산자(&)는 둘 다 1이어야만 1이 되고
둘 중 하나라도 0이면 0이 된다.
비트논리 OR 연산자(|)는 둘 중 하나만 1이어도 1이 되고
둘 다 0이어야만 0이 된다.
그리고 배타적 논리합 XOR(^)이라는 녀석을 만났는데 이녀석은
두 값이 같으면 무조건 0이고
두 값이 다르면 무조건 1이 된다.
'프로그래밍 기본 지식 > Chapter 2 연산자' 카테고리의 다른 글
[Chapter 2 연산자] 9. 대입 연산자 (Assignment Operator) (3) | 2019.05.23 |
---|---|
[Chapter 2 연산자] 8. 3항(삼항) 연산자 (1) | 2019.05.23 |
[Chapter 2 연산자] 6. 비트 연산자 - 시프트 연산자 (Shift Operator) (8) | 2019.05.20 |
[Chapter 2 연산자] 5. 비트 연산자 - 비트전환 연산자 (3) | 2019.05.20 |
[Chapter 2 연산자] 4. 단항 연산자(Operator)의 종류 (증감 연산자) (1) | 2019.05.20 |