[ 공 부 ]/[ C + + ]

[C++] 비트 연산자 사용

HiStar__ 2020. 7. 10. 18:59

비트 연산자

 

  • 비트(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 0111

    0000 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을 하여 부호를 바꿀 수 있다.