서노썬
sun noes sun
서노썬
전체 방문자
오늘
어제
  • 카테고리 (142)
    • Java (89)
      • Day1 (20)
      • Day2 (16)
      • Day3 (4)
      • Day4 (5)
      • Day5 (2)
      • Day6 (2)
      • Day7 (4)
      • Day8 (6)
      • Day9 (3)
      • Day10 (0)
      • Day11 (0)
      • Day12 (0)
      • Day13 (3)
      • Day14 (0)
      • Day15 (0)
      • Day16 (0)
      • Day19 (0)
      • Day20 (0)
      • Day21 (2)
      • Day22 (4)
      • Day23 (2)
      • Day24 (5)
      • Day25 (4)
      • Day27 (2)
      • Day28 (3)
      • Day29 (1)
      • Day30 (1)
      • Day31 (0)
      • Day32 (0)
      • Dat33 (0)
      • Day34 (0)
      • Day35 (0)
      • Day36 (0)
    • HTML (37)
      • Day36 (20)
      • Day37 (3)
      • Day38 (2)
      • Day39 (8)
      • Day40 (3)
    • SQL (4)
      • Day40 (4)
      • Day41 (0)
      • Day42 (0)
      • Day43 (0)
      • Day44 (0)
      • Day45 (0)
    • JSP (0)
      • Day46 (0)
      • Day75 (0)
    • PYTHON (0)
      • Day75 (0)
      • Day76 (0)
    • Photo (12)

블로그 메뉴

  • 홈
  • 방명록

인기 글

최근 글

태그

  • 자바연산자
  • 논리연산자
  • java메뉴입력
  • 자바continue
  • java데이터타입
  • java자료형
  • Java
  • 자바자료형
  • 자바break
  • 자바

티스토리

hELLO · Designed By 정상우.
서노썬

sun noes sun

Java/Day4

[Java] 비트 연산자

2021. 11. 4. 11:20

1. 비트 연산자

 

1
2
3
4
5
6
7
8
9
10
class Test
{
    public satic void main(String[] args)
    {
        System.out.println(5&3);  // 비트 & 연산자 (이항연산자)
        System.out.println(5|3);  // 비트 | 연산자 (이항연산자)
        System.out.println(5^3);  // 비트 ^ 연산자 (이항연산자)
        System.out.println(~5);  // 비트 ~ 연산자 (항이 1개. 단항연산자)
    }
}
Colored by Color Scripter
cs

 

(1) 비트 AND 연산자 (&)

- 상위 비트와 하위 비트 둘 다 1일 때만 1이고 나머지는 다 0

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 1

↓& 연산자

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 0 1


(2) 비트 OR 연산자 ( | )

- 상위비트와 하위비트 둘 중에 하나만 1이어도 1, 둘 다 0이어야 0

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 1

↓ | 연산자

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 1 1


(3) 비트 XOR 연산자 ( ^ )
 
- 상위비트와 하위비트가 서로 같으면 0, 다르면 1

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1
0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 1

↓ ^ 연산자

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 1 0


(4) 비트 NOT 연산자 ( ~ )

- 1은 0으로, 0은 1로 반전   (1의 보수를 취한다랑 동일)

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 1

↓ ~ 연산자

1 ~~~~~~~~~~~~~~~ 1 1 1 1 1 0 1 0

 

 

2. 비트 연산자 예문

 

(1) 16과 7에 대한 ( &, |, ^, ~)

(2) 20과 5에 대한 ( &, |, ^, ~)

(3) 9와 4에 대한 ( &, |, ^, ~)

(4) 11가 6에 대한 ( &, |, ^, ~)

 

 

3. 왼쪽 비트 쉬프트 연산자 ( << )

 

- 2진수이기 때문에 왼쪽으로 1비트씩 옮길 때마다 2의 거듭제곱으로 커지는 효과가 있다.

2의 2진수 : 0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0
1의 2진수 : 0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 0 1


(1) System.out.println(2<<1);    // 4가 된다.

- 왼쪽으로 1비트 옮긴다는 뜻
- 이렇게 할 경우 최상위비트에 있던 0이 벗어나게 된다. 이렇게 벗어나는 비트는 버린다.
- 이렇게 벗어나는 비트는 버리고 비는 비트는 0으로 채운다.

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0

↓ <<1

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 0


(2) System.out.println(2<<2);     // 8이 된다.

- 왼쪽으로 2비트 옮긴다는 뜻.
- 이렇게 할 경우 최상위비트에 있던 0, 2개가 벗어나게 된다.
- 이렇게 벗어나는 비트는 버리고 비는 비트는 0으로 채운다.

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0

↓ <<2

0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0


(3) System.out.println(2<<3);     // 16이 된다.

- 왼쪽으로 3비트 옮긴다는 뜻.
- 이렇게 할 경우 최상위비트에 있던 0, 3개가 벗어나게 된다.
- 이렇게 벗어나는 비트는 버리고 비는 비트는 0으로 채운다.

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0

↓ <<3

0 ~~~~~~~~~~~~~~~ 0 0 0 1 0 0 0 0


- 2를 왼쪽으로 1비트 옮기면 4, 2비트 옮기면 8, 3비트 옮기면 16이 된다.

(10진수를 왼쪽으로 1비트, 2비트, 3비트 옮기게 되면 10의 거듭제곱으로 커진다)

 

 

3. 오른쪽 비트 쉬프트 연산자 ( >> )

 

(1) System.out.println(8>>1);    // 4가 된다.

- 오른쪽으로 1비트 옮긴다는 뜻.
- 이렇게 할 경우 최하위비트에 있던 0, 1개가 벗어나게 된다.
- 벗어나는 비트는 버리고, 부호비트를 유지하기 위해서 비는 비트는 양수면 0으로, 음수면 1로 채운다.

0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0

↓ >>1

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 0


(2) System.out.println(8>>2);    // 2가 된다.

- 오른쪽으로 2비트 옮긴다는 뜻.
- 이렇게 할 경우 최하위비트에 있던 0, 2개가 벗어나게 된다.
- 벗어나는 비트는 버리고, 부호비트를 유지하기 위해서 비는 비트는 양수면 0으로, 음수면 1로 채운다.

0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0

↓ >>2

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 1 0


(3) System.out.println(8>>3);    // 1이 된다.

- 오른쪽으로 3비트 옮긴다는 뜻.
- 이렇게 할 경우 최하위비트에 있던 0, 3개가 벗어나게 된다.
- 벗어나는 비트는 버리고, 부호비트를 유지하기 위해서 비는 비트는 양수면 0으로, 음수면 1로 채운다.

0 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0

↓ >>3

0 ~~~~~~~~~~~~~~~ 0 0 0 0 0 0 0 1


- 8을 왼쪽으로 1비트 옮기면 4, 2비트 옮기면 2, 3비트 옮기면 1이 된다.


(4) System.out.println(-8>>1);    // -4가 된다.

1 ~~~~~~~~~~~~~~~ 0 0 0 0 1 0 0 0

↓ >>1

1 ~~~~~~~~~~~~~~~ 0 0 0 0 0 1 0 0


(5)

System.out.println(8>>>1);     //4가 된다.

- 8>>1의 경우 양수면 비는 비트를 0으로, 음수면 비는 비트를 1로 채웠지만
얘는 비는 비트를 무조건 0으로 채운다.

 

 

4. 비트 연산자 예문

 

int형 정수 15678의 오른쪽 세 번째 비트와 다섯 번째 비트가 각각 어떻게 되는지 확인하여 출력하기.

 

1
2
3
4
5
6
7
8
9
class Test
{
    public static void main(String[] args)
    {
        int num = 15678;
        System.out.println( (num>>2) &1 );
        System.out.println( (num>>4) &1 );
    }
}
Colored by Color Scripter
cs

 

- 구하고자 하는 자리의 비트를 최하위로 보내준 후 1과 비트 & 연산자를 해주었을 때 & 연산자의 특성으로 둘 다 1이어야 1, 아니면 0이 출력되기 때문에 구하고자 하는 자리의 비트도 1일 경우 1이 출력되며 구하고자 하는 자리의 비트가 0일 경우 0이 출력된다.

'Java > Day4' 카테고리의 다른 글

[Java] 사용자 정의 메소드 & 예문  (0) 2021.11.04
[Java] 삼항 연산자 & short circuit evaluation  (0) 2021.11.04
[Java] 데이터 타입. 자료형에 따른 연산  (0) 2021.11.04
[Java] switch case 구문  (0) 2021.11.03
    'Java/Day4' 카테고리의 다른 글
    • [Java] 사용자 정의 메소드 & 예문
    • [Java] 삼항 연산자 & short circuit evaluation
    • [Java] 데이터 타입. 자료형에 따른 연산
    • [Java] switch case 구문

    티스토리툴바