//비트 연산자 <<, >>, &, |
//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
//switch
int num = 10;
switch (num) //c++ 에서는 정수로 바뀔 수 있는 것만 됐는데(int, char, enum 변수)
//c#은 문자도 가능
{
case 1:
break;
case 10:
break;
default:
break;
}
//c#은 문자도 가능
//하지만 문자열 비교는 자원 소모가 크므로 안하는 것이 좋다.
string str2 = "개구리";
switch (str2)
{
/*
//아래와 같이 명령어가 있는데 break;가 없으며 에러난다.(c++에서는 가능했다.)
case "개구리":
Console.WriteLine("개구리 입니다.");
case "두꺼비":
Console.WriteLine("두꺼비 입니다.");
break;
//아래와 같이 명령어가 없으면 가능하다.
case "개구리":
case "두꺼비":
Console.WriteLine("두꺼비 입니다.");
break;
*/
case "개구리":
Console.WriteLine("개구리 입니다.");
break;
case "두꺼비":
Console.WriteLine("두꺼비 입니다.");
break;
default:
break;
}
//사칙연산 + - * / % ++ --
//c++과 다른 건 %(나머지)
//int는 같은데
int i1 = 32;
int i2 = 5;
Console.WriteLine("{0} % {1} = {2}", i1, i2, i1 % i2);
//float도 가능 해지게 됐다.
float f1 = 3.14f;
float f2 = 0.7f;
Console.WriteLine("{0} % {1} = {2}", f1, f2, f1 % f2);
//아래 ++ 연산은 c++과 같다.
int n0 = 10;
int n1 = n0;
Console.WriteLine("n0 = {0}, n1 = {1}", n0, n1); //10, 10
n1 = n0++;
Console.WriteLine("n0 = {0}, n1 = {1}", n0, n1); //11, 10;
n1 = ++n0;
Console.WriteLine("n0 = {0}, n1 = {1}", n0, n1); //12, 12;