비트연산자

연산자 이름 설명 지원형식
« 왼쪽 시프트 첫 번째 피연산자의 비트를
두 번째 피연산자의 수만큼
왼쪽으로 이동
첫 번째 연산자는 int, uint, long, ulong
두 번째 연산자는 int형식만 지원
» 오른쪽 시프트 첫 번째 피연산자의 비트를
두 번째 피연산자의 수만큼
오른쪽으로 이동
첫 번째 연산자는 int, uint, long, ulong
두 번째 연산자는 int형식만 지원
& 논리곱(AND) 두 피연산자의 비트 논리합 정수 개열 형식과 bool 형식에 대해 사용
논리합(OR) 두 피연산자의 비트 논리합 정수 개열 형식과 bool 형식에 대해 사용
배타적 논리합(XOR) 두 피연산자의 비트 배타적 논리합 정수 개열 형식과 bool 형식에 대해 사용
~ 보수(NOT) 피연산자의 비트를 0은 1로
1은 0으로 반전(단항연산자)
int, uint, long, ulong에 대해 사용

시프트 연산자 (Shift Operator)

«

240을 16개 비트로 표현

왼쪽으로 2비트 이동

»

오른쪽으로 2비트 이동

음수에 대한 시프트 이동

-255 를 오른쪽 2비트 시프트 이동

비어있는 비트는 1로 채움

int a = 240; 원본 데이터  / 00000000 00000000 00001111 00000000
int b = 2;   옮길 비트의 
int result_1 = a << b; / 00000000 00000000 00111100 00000000  /960
int result_2 = a >> b; / 00000000 00000000 00000011 11000000  /60

원본 데이터를 a, 옮길 비트수를 b라고 했을 때, <<연산을 하면 a * 2b, >>를 하면 a/2b의 결과가 나옴

public static class ShiftOperator  
{  
	public static void Shift()  
	{  
		WriteLine("Testing <<...");  
		  
		int a = 1;  
		WriteLine("a : {0:D3} (0x{0:X8})", a);  
		WriteLine("a << 1 : {0:D3} (0x{0:X8})", a << 1);  
		WriteLine("a << 2 : {0:D3} (0x{0:X8})", a << 2);  
		WriteLine("a << 5 : {0:D3} (0x{0:X8})", a << 5);  
		  
		WriteLine("\nTesting >> ...");  
		int b = 255;  
		WriteLine("b : {0:D3} (0x{0:X8})", b);  
		WriteLine("b >> 1 : {0:D3} (0x{0:X8})", b >> 1);  
		WriteLine("b >> 2 : {0:D3} (0x{0:X8})", b >> 2);  
		WriteLine("b >> 5 : {0:D3} (0x{0:X8})", b >> 5);  
		  
		WriteLine("\nTesting >> 2 ...");  
		  
		int c = -255;  
		WriteLine("c : {0:D3} (0x{0:X8})", c);  
		WriteLine("c >> 1 : {0:D3} (0x{0:X8})", c >> 1);  
		WriteLine("c >> 2 : {0:D3} (0x{0:X8})", c >> 2);  
		WriteLine("c >> 5 : {0:D3} (0x{0:X8})", c >> 5);  
	}  
}


비트 논리 연산자

논리곱 연산자 &

int result = 9 & 10; / result = 8;

논리합 연산자 |

int result = 9 | 10; / result = 11;

배타적 논리합 연산자 ^

int result = 9 ^ 10; / result = 3;

보수연산자 ~

int a = 255;
int result = ~ a; / result = -255;

public static void BitOperator()  
{  
	int a = 9;  
	int b = 10;  
	  
	WriteLine($"{a} & {b}: {a & b}");  
	WriteLine($"{a} | {b}: {a | b}");  
	WriteLine($"{a} ^ {b}: {a ^ b}");  
	  
	int c = 255;  
	WriteLine("~{0}(0x{0:X8}) : {1}(0x{1:X8})", c, ~c);  
}