반응형
비트 연산과 시프트 연산
먼저 비트 연산을 하기 전에 비트에 대해서 알아보겠습니다.
비트(bit, binary digit)는 하나의 비트는 0이나 1의 값을 가질 수 있고, 각각은 참, 거짓 혹은 서로 배타적인 상태를 나타낸다. |
이것을 간단하게 2진수로 표현하자면 0,1이 됩니다. 이런 비트가 8개 모이면 그것은 8비트고 다른 말로 바이트가 되고 , 1바이트는 문자를 처리하는 최소 단위로 다른 말로 캐릭터(Character)라고 합니다.
비트 연산의 종류 |
& (AND) | 둘 모두 1이면 1을 반환합니다. | 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 |
| (OR) | 하나 이상 1이면 1을 반환합니다. | 0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 |
^ (XOR) | 서로 다르면 1을 반환합니다. | 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0 |
~ (NOT) | 1이었으면 0 , 0이었으면 1을 반환합니다. | ~0 = 1 ~1 = 0 |
<< (Shift) | 왼쪽으로 시프트 연산을 합니다. ( n 칸 이동) | 0100 << 2 = 1000 |
>> (Shift) | 오른쪽으로 시프트 연산을 합니다. (n 칸 이동) | 0101 >> 2 = 0010 |
& (AND) 연산
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
|
void main()
{
int number1 = 5;
int number2 = 10;
int number3 = 12;
int result = number1 & number2;
int result2 = number1 & number3;
//ex 1 = 0
cout << result << endl;
//ex 2 = 4
cout << result2 << endl;
/*
ex 1)
0000 0101
0000 1010
---------
0000 0000
ex 2)
0000 0101
0000 1100
---------
0000 0100
*/
}
|
cs |
| (OR) 연산
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
|
void main()
{
int number1 = 5;
int number2 = 10;
int number3 = 12;
int result = number1 | number2;
int result2 = number1 | number3;
//ex 1 = 15
cout << result << endl;
//ex 2 = 13
cout << result2 << endl;
/*
ex 1)
0000 0101
0000 1010
---------
0000 1111
ex 2)
0000 0101
0000 1100
---------
0000 1101
*/
}
|
cs |
^ (XOR) 연산
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
|
void main()
{
int number1 = 5;
int number2 = 10;
int number3 = 12;
int result = number1 ^ number2;
int result2 = number1 ^ number3;
//ex 1 = 15
cout << result << endl;
//ex 2 = 9
cout << result2 << endl;
/*
ex 1)
0000 0101
0000 1010
---------
0000 1111
ex 2)
0000 0101
0000 1100
---------
0000 1001
*/
}
|
cs |
~ (NOT) 연산
: 최상위 부호가 1이기 때문에 -로 표시합니다. 이 값은 1의 보수가 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
int number1 = 5;
int number2 = 10;
int result = ~number1;
int result2 = ~number2;
//ex 1 = -6
cout << result << endl;
//ex 2 = -11
cout << result2 << endl;
/*
ex 1)
0000 0000 0000 0000 0000 0000 0000 0101
---------
1111 1111 1111 1111 1111 1111 1111 1010
ex 2)
0000 0000 0000 0000 0000 0000 0000 1010
---------
1111 1111 1111 1111 1111 1111 1111 0101
*/
|
cs |
<< 왼쪽 시프트 연산
쉽게 n 만큼 왼쪽으로 칸을 이동시키는 것입니다. 이동 시킨 이후에 부분은 0으로 채워집니다.
10진수로 표현하자면
만큼 곱해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
void main()
{
int number = 5;
int result = number << 1;
// ex 1 = 10
cout << result << endl;
/*
0000 0101
---------
0000 1010
*/
}
|
cs |
>> 오른쪽 시프트 연산
쉽게 n 만큼 오른쪽으로 칸을 이동시키는 것입니다. 만약 음수라면 이동 시킨 이후에 부분은 1로 채워집니다.
10진수로 표현하자면
만큼 나눠줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
void main()
{
int number = 10;
int result = number >> 1;
// ex 1 = 5
cout << result << endl;
/*
0000 1010
---------
0000 0101
*/
}
|
cs |
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 스마트 포인터 (0) | 2015.11.16 |
---|---|
[C++] 생성자와 소멸자 (0) | 2015.11.15 |
[ C++]연산자 오버로딩(1) - operator 키워드 (0) | 2015.10.20 |
[ C++]클래스 상속(4) - 순수 가상 함수 & 다중 상속 (0) | 2015.09.29 |
[ C++]클래스 상속(3) - 가상 함수 (0) | 2015.09.29 |