๋นํธ ์กฐ์
๊ฐ๋
๋นํธ(bit)๋ 0๊ณผ 1์ ๊ฐ์ ๊ฐ์ง ์ ์๋ ๋ฐ์ดํฐ์ ๋จ์์ด๋ค. 4bit๋ฅผ ๋ชจ์ ๋จ์๋ฅผ ๋๋ธ(nibble)์ด๋ผ ๋ถ๋ฅด๊ณ , 8bit๋ฅผ ๋ชจ์ ๋จ์๋ฅผ ๋ฐ์ดํธ(byte)๋ผ๊ณ ๋ถ๋ฅธ๋ค. 2byte๋ฅผ ๋ชจ์ ๋จ์๋ ์ผ๋ถ ์ ์ํต์ ๊ธฐ๊ธฐ์์ ์๋(word)๋ผ๊ณ ํ๋ค.
๊ตฌํ
C++์์๋ ๋นํธ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์ <bitset>
์ด๋ผ๋ ํค๋๋ฅผ ํฌํจํด์ ์ฌ์ฉํ๋ค.
์ฐ์ฐ
C++์์ ๋นํธ์ฐ์ฐ๋ค์ ์์์ ์ธ๊ธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฝ๊ฒ ๊ฐ์ ธ๋ค ์ธ ์ ์์ง๋ง, ๊ฐ๋ ๊ณต๋ถ ์ธก๋ฉด์์ ๊ทธ๋ฅ ๊ตฌํ๋ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ๋ ์ตํ๋๋ คํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด 1byte ๋จ์๋ก ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, bit ๋จ์์ ์๋ฃํ์ ์๋ค. ๋ค๋ง bool ํ์ ๋ฉ๋ชจ๋ฆฌ ์์์ 1byte๋ฅผ ์ฐจ์งํ์ง๋ง ๊ฐ๋ฅํ ๊ฐ์ด true ํน์ false ๋ฐ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํด์ 0๊ณผ 1์ ํํํ๊ธฐ๋ก ํ์.
(์๋ฃํ ์ ๋ฆฌ)
๊ธฐ๋ณธ ๊ฐ๋
2์ ๋ณด์, ์์
์ปดํจํฐ๊ฐ ์ ์๋ฅผ ์ ์ฅํ ๋๋ ๋๋ถ๋ถ 2์ ๋ณด์ ํํ๋ก ์ ์ฅํ๋ค. ๊ทธ ์ธ์๋ ๋ถํธํ ์ ๋๊ฐ์ผ๋ก ์ ์ฅํ ์๋ ์๊ณ 1์ ๋ณด์ ํํ๋ก ์ ์ฅํ ์๋ ์๋ค.
ํํ๋ฐฉ์ | +5 | -5 |
---|---|---|
๋ถํธํ ์ ๋๊ฐ | 0101 | 1101 |
1์ ๋ณด์ | 0101 | 1010 |
2์ ๋ณด์ | 0101 | 1011 |
๊ฐ์ฅ ์ผ์ชฝ์ MSB(์ต์์ ๋นํธ)๋ ์์ ๋ถํธ๋ฅผ ๋ํ๋ด๊ณ MSB๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋นํธ๋ค๋ก ์๋ฅผ ๋ํ๋ธ๋ค. MSB๊ฐ 0์ด๋ฉด ์์์ด๊ณ 1์ด๋ฉด ์์์ด๋ค. ๋ฐ๋ผ์ n๋นํธ, 2์ ๋ณด์ ํํ๋ก ์ ์๋ฅผ ๋ํ๋ผ ๋, ์ ์์ ๋ฒ์๋ -2^(n-1)~2^(n-1)-1
์ด๋ค. ๋๋จธ์ง ๋ ๋ฐฉ์๊ณผ๋ ๋ค๋ฅด๊ฒ +0์ -0์ด ์๋ ํ๋์ 0์ผ๋ก ํํํ๊ธฐ ๋๋ฌธ์, ํํ ๋ฒ์๊ฐ ๋ ํฌ๋ค.
์์๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์๋ ๊ธฐ์กด์ ์์์ ๋นํธ๋ฅผ ๋ค์ง์ ๋ค์(1์ ๋ณด์) 1์ ๋ํด์ฃผ๋ฉด ๋๋๋ฐ, ์ด๋ ๊ธฐ์กด์ ์๋ฅผ 2์ ๋ณด์ํํ์ ์ด์ฉํด์ ์์๋ก ๋ํ๋ธ ๊ฒ์ด๋ค. ๊ธฐ์กด์ ์์ ํด๋น ์์ ๋ณด์๋ฅผ ํฉํ๋ฉด ์ง์๊ฐ ๋์ค๋๋ฐ, ์์ ์์ ์์๋ ๊ธฐ์กด์ ์๊ฐ 5์ด๊ณ ๋ง์ง๋ง ์๊ฐ -3์ผ๋ก ํ์๋ ๋ฐ์์ ๋ณด์์ ์ฑ์ง์ ๋ง์กฑํ๋ค๊ณ ๋ณผ ์ ์๋ค.
์ปดํจํฐ ๋ด๋ถ์์๋ ์ฌ์น์ฐ์ฐ ์ ๊ฐ์ฐ๊ธฐ(Adder)๋ง ์ด์ฉํ๊ธฐ ๋๋ฌธ์, ์ด๋ ๊ฒ 2์ ๋ณด์ ํํ๋ฒ์ ์ด์ฉํด์ ๋ง์ ์ ๊ณ์ฐํ๋ฉฐ ๋บ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์๋ฅผ ๋ง๋ค์ด์ ๋ง์ ์ ๊ณ์ฐํ๋ค.
(์ค์ ํํ)
์ฐ์ ์ํํธ, ๋ ผ๋ฆฌ ์ํํธ
์ํํธ ์ฐ์ฐ์ ๋นํธ๋ฅผ 1bit์ฉ ๋ฐ๋ฉด์ ์๊ธด ๋น์๋ฆฌ์ ์๋ก์ด bit๋ฅผ ์ฑ์์ฃผ๋ ์ฐ์ฐ์ด๋ค.
์ฐ์ ์ํํธ ์ฐ์ฐ์ ๋ถํธ๋นํธ๋ฅผ ๊ทธ๋๋ก ์ฑ์์ค๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก 2๋ก ๋๋๊ฑฐ๋ ๊ณฑํ ๊ฒฐ๊ณผ์ ๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ฐ์ ์ํํธ ์ฐ์ฐ์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
๋ ผ๋ฆฌ ์ํํธ ์ฐ์ฐ์ ๋ถํธ๋นํธ์ 0์ ์ฑ์์ค๋ค. ๋ฐ๋ผ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋นํธ๋ฅผ ์ ์ดํ๋ ์ฐ์ฐ์ผ๋ก ์ฐ์ ์ ์ผ๋ก๋ ๊ฑฐ์ ๊ด๊ณ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ์ซ์๊ฐ ๋ณํํ๋ค.
๊ธฐ๋ณธ ์ฐ์ฐ
-
NOT [
~
] : 1์ด๋ฉด 0, 0์ด๋ฉด 1 -
OR [
|
] : ๋ ๊ฐ ์ค 1์ด ํ๋๋ผ๋ ์๋ค๋ฉด 1, ์๋๋ฉด 0ํฉ์งํฉ ๊ฐ๋ ๊ณผ ์ ์ฌํ๋ค.
-
XOR [
^
] : ๋ ๊ฐ์ด ๋ค๋ฅด๋ฉด 1, ๊ฐ์ผ๋ฉด 0์ค์ ๋ก๋ XOR์ ๋ค์ด๊ฐ๋ ๊ฐ ์ค 1์ ๊ฐฏ์๊ฐ ํ์๊ฐ์ด๋ฉด 1
-
AND [
&
] : ๋ ๊ฐ ๋ชจ๋ 1์ด๋ผ๋ฉด 1, ์๋๋ฉด 0๊ต์งํฉ ๊ฐ๋ ๊ณผ ์ ์ฌํ๋ค.
-
SHIFT [
<<
>>
] : ๋นํธ ๋จ์๋ก ํ ์นธ์ฉ ๋ฏธ๋ ์ฐ์ฐ
ํจ์ ๊ตฌํ
- Get : ํน์ ์์น์ ๋นํธ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
- Set : ํน์ ์์น์ ๋นํธ ๊ฐ์ ์ธํ ํ๋ค.
- Count : ์ธํ ๋ ๋นํธ ๊ฐ์ด ๋ช ๊ฐ์ธ์ง ๋ฐํํ๋ค.
- Clear : ๋นํธ๋ฅผ 0์ผ๋ก ์ด๊ธฐํ ํ๋ค.
- Toggle : ๋นํธ๋ฅผ ๋ฐ์ ์ํจ๋ค.
- MSB : ์ต์์ ๋นํธ๋ฅผ ์ฐพ๋๋ค.
- LSB : ์ตํ์ ๋นํธ๋ฅผ ์ฐพ๋๋ค.
<bitset> ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ
#include <bitset>
#include <iostream>
using namespace std;
int main() {
bitset<5> num;
cout << num << endl; // 00000
// set
num.set(2, 1);
num[3] = 1;
cout << num << endl; // 01100
// get
// pos๋ฅผ ์์์๋ถํฐ ์ธ์ผํจ
cout << num[2] << endl; // 1
cout << num.test(2) << endl; // 1
// count
cout << num.count() << endl; // 1์ด ๋ช๊ฐ? 2
cout << num.size() - num.count() << endl; // 0์ด ๋ช๊ฐ? 3
// clear
num.reset(2);
cout << num << endl; // 01000
// toggle
// ์ฌ๊ธฐ์๋ถํฐ pos๋ฅผ ๋ค์์๋ถํฐ ์ธ์ผํจ
num.flip(1);
cout << num << endl; // 01010
num.flip();
cout << num << endl; // 10101
// MSB, LSB x
}
์ง์ ๊ตฌํ
#include <iostream>
#include <string>
#define BITNUM 8*sizeof(char)
using namespace std;
string GetString(char num) {
string tmp(BITNUM,'0');
for (int i = 0; i < BITNUM; i++) {
if ((char)((char)(num << (BITNUM - 1-i)) >> BITNUM) == 0)
tmp[BITNUM - i - 1] = '0';
else
tmp[BITNUM - i - 1] = '1';
}
return tmp;
}
bool Get(char num, int pos) {
char tmp = 1 << (BITNUM - pos -1);
return (tmp & num);
}
void Set(char& num, int pos) {
char tmp = 1 << (BITNUM - pos -1);
num = (tmp | num);
}
int Count(char num) {
int cnt = 0;
for (int i = 0; i < BITNUM; i++) {
char tmp = pow(2, i);
if ((num & tmp) != 0)
cnt++;
}
return cnt;
}
void Toggle(char& num) {
num = ~num;
}
void Toggle(char& num, int pos) {
char tmp = pow(2, pos);
num ^= tmp;
}
void Clear(char& num, int pos) {
char tmp = ~((char)pow(2, BITNUM- pos-1));
num &= tmp;
}
bool MSB(char& num) {
if (num >> (BITNUM - 1))
return true;
else
return false;
}
bool LSB(char& num) {
char tmp = num << (BITNUM - 1);
tmp >> (BITNUM - 1);
if (tmp)
return true;
else
return false;
}
int main() {
char num = 0;
// set
Set(num, 2); Set(num, 5); Set(num, 6);
cout << GetString(num) << endl;// 00100110
// get
cout << Get(num, 2) << endl; // 1
// count
cout << Count(num) << endl;
// clear
Clear(num, 5);
cout << GetString(num) << endl;// 00100010
// toggle
Toggle(num); //
cout << GetString(num) << endl;// 11011101
Toggle(num,1); Toggle(num, 7);
cout << GetString(num) << endl;// 01011111
// MSB
cout << MSB(num) << endl; // 0
// LSB
cout << LSB(num) << endl; // 1
}
๋นํธ๋ง์คํฌ(BitMask)
์ฌ๋ฌ ํํ ์ ๋นํธ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ณ ํจ์จ์ ์ผ๋ก ํํํ ์ ์๋ค. ์ด๋ฅผ bitmask๋ผ๊ณ ํ๋๋ฐ, ์๋ฅผ ๋ค์ด ์งํฉ {1,2,3,5}๊ฐ ์์ ๋ 11101๋ก ๋ํ๋ผ ์ ์๊ณ ์ ์ฅํ ๋๋ 10์ง์๋ก 29๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ ์ด์ฉํ ํ์์์ด ์ ์ ํ๋๋ง์ผ๋ก ์ ์ฅ์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค. ๋นํธ๋ง์คํฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์๋ ์์์ ์ธ๊ธํ๋ ๋นํธ์ฐ์ฐ์ ์ฌ์ฉํด์ผํ๋ค.
์ฐธ๊ณ
'์ปดํจํฐ๊ณผํ (CS) > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์ฌ๊ทํธ์ถ (๋์ ๊ณํ๋ฒ) (1) | 2020.08.09 |
---|---|
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์ฌ๊ทํธ์ถ (์์ ํ์) (0) | 2020.07.31 |
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์๋ฃ๊ตฌ์กฐ - ๊ตฌ์กฐ์ฒด (0) | 2020.07.28 |
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์๋ฃ๊ตฌ์กฐ - ํ (0) | 2020.07.28 |
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์๋ฃ๊ตฌ์กฐ - ํธ๋ฆฌ (0) | 2020.07.28 |
Comment