[C++] 비트 연산자 사용
비트 연산자
-
비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자.
코 드
#include <iostream>
#include <bitset>
// 1byte 8bit
int main() {
// int : 4bytes -> 4 * 8 = 32 bit
int number_01{ 1'001 };
int number_02{ -1'001 };
int number_03{ number_01 & number_03 };
int number_04{ number_01 | number_03 };
int number_05{ number_01 ^ number_03 };
int number_06{ ~number_01 };
int number_07{ ~number_02};
int number_08{ number_01 >> 2 };
int number_09{ number_01 << 2 };
int number_10{ number_02 >> 2 };
int number_11{ number_02 << 2 };
int number_12{ number_01 >> 32 };
int number_13{ number_01 << 32 };
int number_14{ number_02 >> 32 };
int number_15{ number_02 << 32 };
int number_16{ number_08 << 2 };
int number_17{ number_10 << 2 };
int i{ 0 };
std::cout << ++i << ". " << number_01 << "\n" << std::bitset<32>(number_01) << '\n';
std::cout << ++i << ". " << number_02 << "\n" << std::bitset<32>(number_02) << '\n';
std::cout << ++i << ". " << number_03 << "\n" << std::bitset<32>(number_03) << '\n';
std::cout << ++i << ". " << number_04 << "\n" << std::bitset<32>(number_04) << '\n';
std::cout << ++i << ". " << number_05 << "\n" << std::bitset<32>(number_05) << '\n';
std::cout << ++i << ". " << number_06 << "\n" << std::bitset<32>(number_06) << '\n';
std::cout << ++i << ". " << number_07 << "\n" << std::bitset<32>(number_07) << '\n';
std::cout << ++i << ". " << number_08 << "\n" << std::bitset<32>(number_08) << '\n';
std::cout << ++i << ". " << number_09 << "\n" << std::bitset<32>(number_09) << '\n';
std::cout << ++i << ". " << number_10 << "\n" << std::bitset<32>(number_10) << '\n';
std::cout << ++i << ". " << number_11 << "\n" << std::bitset<32>(number_11) << '\n';
std::cout << ++i << ". " << number_12 << "\n" << std::bitset<32>(number_12) << '\n';
std::cout << ++i << ". " << number_13 << "\n" << std::bitset<32>(number_13) << '\n';
std::cout << ++i << ". " << number_14 << "\n" << std::bitset<32>(number_14) << '\n';
std::cout << ++i << ". " << number_15 << "\n" << std::bitset<32>(number_15) << '\n';
std::cout << ++i << ". " << number_16 << "\n" << std::bitset<32>(number_16) << '\n';
std::cout << ++i << ". " << number_17 << "\n" << std::bitset<32>(number_17) << '\n';
}
내 용
-
C++에서 2진법으로 화면에 출력하기 위해 사용하는 bitset
-
int는 4byte 즉 32bit 임으로 최대 32개의 0과 1로 표현할 수 있다.
- number_01{1'001} | number_02{-1'001}
+ 와 -
-
1. number_01
0000 0000 0000 0000 0000 0011 1110 1001 -
2. number_02
1111 1111 1111 1111 1111 1100 0001 0111 -
최상위 비트(MSB : Most Significant Bit) 값을 가지고 양수와 음수로 판단을 한다.
0 : 양수 | 1 : 음수 -
+에서 - | - 에서 + 로 바꾸기 위해서는 보수를 구하고 1을 더해주면 된다.
~(number_01) + 1 : number_02
1111 1111 1111 1111 1111 1100 0001 0111~(number_02) + 1 : number_01
0000 0000 0000 0000 0000 0011 1110 1001
[ & , | , ^ , ~]
-
& ( AND ) : 대응되는 비트가 1이면 1을 반환.
number_01 & number_02 : 1
0000 0000 0000 0000 0000 0011 1110 1001
1111 1111 1111 1111 1111 1100 0001 0111
0000 0000 0000 0000 0000 0000 0000 0001 -
| ( OR ) : 대응 되는 비트가 하나라도 1이면 1을 반환.
number_01 | number_02 : -1
0000 0000 0000 0000 0000 0011 1110 1001
1111 1111 1111 1111 1111 1100 0001 0111
1111 1111 1111 1111 1111 1111 1111 1111 -
^ ( XOR ) : 대응 되는 비트가 서로 다르면 1을 반환.
number_01 ^ number_02 : -2
0000 0000 0000 0000 0000 0011 1110 1001
1111 1111 1111 1111 1111 1100 0001 0111
1111 1111 1111 1111 1111 1111 1111 1110 -
~ ( NOT ) : 비트가 1이면 0으로, 0이면 1로 반전.
~number_01 : -1002
0000 0000 0000 0000 0000 0011 1110 1001
1111 1111 1111 1111 1111 1100 0001 0110~number_02 : 1000
1111 1111 1111 1111 1111 1100 0001 01110000 0000 0000 0000 0000 0011 1110 1000
[ >> , << ]
-
>> ( Right Shift ) : 지정한 수만큼 비트들을 오른쪽으로 이동.
number_01 >> 2 : 250
0000 0000 0000 0000 0000 0011 1110 1001
0000 0000 0000 0000 0000 0000 1111 1010
number_02 >> 2 : -251
1111 1111 1111 1111 1111 1100 0001 0111
1111 1111 1111 1111 1111 1111 0000 0101 -
<< ( Left Shift ) : 지정한 수만큼 비트들을 왼쪽으로 이동
number_01 << 2 : 4004
0000 0000 0000 0000 0000 0011 1110 1001
0000 0000 0000 0000 0000 1111 1010 0100
number_02 << 2 : -4004
1111 1111 1111 1111 1111 1100 0001 0111
1111 1111 1111 1111 1111 0000 0101 1100 -
>> 후 <<
number_01 >> 2 << 2 : 1000
0000 0000 0000 0000 0000 0011 1110 1001
0000 0000 0000 0000 0000 0000 1111 1010
0000 0000 0000 0000 0000 0011 1110 1000
number_02 >> 2 << 2 : -1004
1111 1111 1111 1111 1111 1100 0001 0111
1111 1111 1111 1111 1111 1111 0000 0101
1111 1111 1111 1111 1111 1100 0001 0100
출 력 값
절 댓 값 구 하 기
#include <iostream>
#include <bitset>
constexpr int MAX_INT{ 0x7FFF'FFFF };
const int ABS(const int&);
int main() {
std::cout << ABS(100) << '\n';
std::cout << ABS(-100) << '\n';
return 0;
}
const int ABS(const int& num) {
// + 라면 모두 0, - 라면 모두 1로 비트가 변경됨
// +라면 0, -라면 -1이다.
int temp{ num >> sizeof(int) * 8 - 1 };
return ( temp ^ num ) - temp;
}
-
>> 31을 할 경우 -의 값의 경우 -1 이 되고, + 일 경우 0이다.
그러므로 ^ ( XOR ) 연산자를 통하여 값을 구하면 -일 경우 보수가 구해지고, -1을 하여 부호를 바꿀 수 있다.