
<aside> 💡 목차
</aside>
https://github.com/POCU/COMP1500CodeSamples
<aside> 💡 연산을 담당하는 무엇
연산자는 하나 이상의 피연산자를 가짐
</aside>
<aside> 💡 비트 플래그란
불리언 형을 따로 쓰지 않고도
비트 하나당 불리언 하나를 집어 넣을 수 있다는 의미이다.
</aside>
using System;
namespace BitFlag
{
class Program
{
static void Main(string[] args)
{
const int BIT_FLAG_SIZE = 8; //1바이트에 8개의 비트가 들어간다고 정의한것임
//모든 boolean 이 0이니까 거짓 상태라고 이해할 수 있다
//1바이트 = 8개의 비트가 전부 0으로 초기화 0000 0000
byte bitFlags = 0;
//오른쪽에서부터 세번째 비트를 True로 설정
//0000 0001 -> 0000 0100
byte mask1 = 1 << 2;
//OR 된 값이 bitFlags에 대입된다
//0000 0000 <- 0000 0100 = 0000 0100
bitFlags |= mask1;
//PadLeft는 빈칸을 채우겠다는 의미
//해당 코드에선 전체 크기에서 값이 없는 빈칸을0으로 채우겠다는 의미
Console.WriteLine("bitFlags: " + Convert.ToString(bitFlags, 2).PadLeft(BIT_FLAG_SIZE, '0'));
//두 비트를 한번에 비교하는 코드
// 0000 1000 | 0010 0000
// = 0010 1000(40)
byte mask3 = (1 << 3) | (1 << 5);
//현재 bitFlags = 0000 0100
// 0000 0100 | 0010 1000
// = 0010 1100
bitFlags |= mask3;
Console.WriteLine("bitFlags: " + Convert.ToString(bitFlags, 2).PadLeft(BIT_FLAG_SIZE, '0'));
//근데 이제 3번째 비트를 끄고싶음
//아까 mask1 은 0000 0100 이었지?
//mask 1을 반전시킨다 1111 1011
//그리고 현재 bitFlags와 AND 연산한다
//0010 1100 & 1111 1011
// = 0010 1000
bitFlags &= (byte)~mask1;
Console.WriteLine("bitFlags: " + Convert.ToString(bitFlags, 2).PadLeft(BIT_FLAG_SIZE, '0'));
//만약 모든 비트를 꺼버리고싶으면, 0과 AND함
//0010 1000 & 0000 0000
// = 0000 0000
bitFlags &= 0;
Console.WriteLine("bitFlags: " + Convert.ToString(bitFlags, 2).PadLeft(BIT_FLAG_SIZE, '0'));
//문자열도 비트플래그로 컨트롤 가능하다
//A는 0100 0001
//공백은 0010 0000
// 0100 0001 | 0010 0000
// 0110 0001 = a
//즉, 소문자 a가 출력될것이다
char char1 = 'A';
int result1 = char1 | ' ';
Console.WriteLine("result1: " + (char)result1);
char char2 = 'a';
int result2 = char2 & '_';
Console.WriteLine("result2: " + (char)result2);
}
}
}