//비트 연산자 <<, >>, &, |
//2진법
//<<왼쪽 시프트 - 한번 시프트에 2배 증가. 오른쪽 새로 생기는 건 0으로 처리. 왼쪽에 사라는건 날라감
//>>오른쪽 시프트 - 한번 시프트에 절반 감소. 왼쪽에 새로 생기는건 0으로 처리. 오른쪽에 사라지는건 날라감
int bitA = 4; //100
int bitB = 2; // 10
Console.WriteLine("bitA : {0}, bit : {1}",
Convert.ToString(bitA, 2), //2진수로 컨버트
Convert.ToString(bitB, 2)); //2진수로 컨버트
Console.WriteLine("{0} & {1} = {2}",
Convert.ToString(bitA, 2),
Convert.ToString(bitB, 2),
Convert.ToString(bitA & bitB, 2)); // &연산
Console.WriteLine("{0} | {1} = {2}",
Convert.ToString(bitA, 2),
Convert.ToString(bitB, 2),
Convert.ToString(bitA | bitB, 2)); // | 연산
//비트 플래그 - 무기장착을 예로 들어 봄
int sword = 0x01; //16진수 => 2진수로 0000 0001 //앞에 더있는 0000 0000 0000 0000 0000 0000 은 생략
int staff = 0x02; //0000 0010
int axe = 0x04; //0000 0100
int spear = 0x08; //0000 1000
int bow = 0x10; //0001 0000
int weaponUsable = sword | axe | spear; //0000 1101
if((weaponUsable & spear) != 0)
{
//spear가 true가 됐다
Console.WriteLine("나는 창을 쓸 수 있다.");
}
else
{
//spear가 false가 됐다
Console.WriteLine("나는 창을 쓸 수 없다.");
}
//weaponUsable : 0000 1101
//spear를 뺴고자 한다.
//spear : 0000 1000
//~spear (보수) :1111 0111
//원하는 결과 : 0000 0101
//weaponUsable와 spear의 보수값을 & 하면 원하는 결과가 나온다.
weaponUsable = weaponUsable & (~spear);
if ((weaponUsable & spear) != 0)
{
//spear가 true가 됐다
Console.WriteLine("나는 창을 쓸 수 있다.");
}
else
{
//spear가 false가 됐다
Console.WriteLine("나는 창을 쓸 수 없다.");
}
//1byte는 8bit => 0000 0000
int value = 5; // 0000 0000 0000 0000 0000 0000 0000 0101
Console.WriteLine("{0} << 2 = {1}",
value, Convert.ToString(value << 2, 2)); // 0001 0100
Console.WriteLine("{0} >> 2 = {1}",
value, Convert.ToString(value >> 2, 2)); // 0000 0001