C#에서 비트마스크 사용
이 게시물에서는 C#에서 비트마스크를 사용하는 방법을 살펴봅니다. 가장 중요한 것은 이 과제를 수행하는 다양한 방법이 있더라도 자신이 하고 있는 일의 이면에 있는 일반적인 아이디어를 이해하고 있다는 것입니다.
비트마스크를 활용하기 위해 메모리의 비트로 작업하게 된다는 사실을 알고 있어야 합니다.
C#
에서 비트마스크 사용
C#에는 다양한 연산자가 있으며 대부분 비트 연산자라고 합니다. 이러한 연산자는 메모리의 비트 수준에서 작업을 수행합니다.
기호가 있는 비트 연산자는 다음과 같습니다.
&
기호로 표시된 연산자는AND
연산자입니다.|
로 표시된 연산자 기호는OR
연산자입니다.~
기호로 표시된 연산자는NOT
연산자입니다.^
기호로 표시된 연산자는XOR
연산자입니다.<<
기호로 표시된 연산자는왼쪽 시프트
연산자입니다.>>
기호로 표시된 연산자는오른쪽 시프트 AND
연산자입니다.
AND
연산자의 작업은 다음과 같습니다.
X Y Res
0 0 0
0 1 0
1 0 0
1 1 1
‘Res’는 출력이고 ‘X’와 ‘Y’는 입력 가능성입니다.
OR
연산자의 작업은 다음과 같습니다.
X Y Res
0 0 0
0 1 1
1 0 1
1 1 1
‘Res’는 출력이고 ‘X’와 ‘Y’는 입력 가능성입니다.
NOT
연산자의 작업은 다음과 같습니다.
X Y
1 0
0 1
Y
는 출력이고 X
는 입력 가능성입니다.
XOR
연산자의 작업은 다음과 같습니다.
X Y Res
0 0 0
0 1 1
1 0 1
1 1 0
‘Res’는 출력이고 ‘X’와 ‘Y’는 입력 가능성입니다.
left-shift
연산자의 작업은 다음과 같습니다.
x = 010110011
두 개의 왼쪽 시프트를 주면 비트가 왼쪽으로 2비트 공간 이동합니다.
x << 2
이제 x
는 다음과 같습니다.
x = 011001100
그리고 오른쪽에는 두 개의 새로운 0
비트가 추가됩니다.
오른쪽 시프트 연산자의 작업은 다음과 같습니다.
x = 010110011
오른쪽으로 두 번 이동하면 비트가 왼쪽으로 2비트만큼 이동합니다.
x >> 2
이제 x
는 다음과 같습니다.
x = 000101100
그리고 왼쪽에는 두 개의 새로운 0
비트가 추가됩니다. 이제 비트 연산자의 작업을 알고 있으므로 입력에 비트마스크를 적용할 수 있습니다.
비트마스크에 사용되는 가장 일반적인 연산자는 AND
연산자입니다. 두 입력이 모두 1일 때 출력이 1이기 때문에 어떤 비트가 1이고 어떤 비트가 0인지 확인하는 데 사용됩니다.
다음은 마스킹된 마지막 4비트를 평가하는 코드입니다.
using System;
namespace HelloWorld {
class Program {
static void Main(string[] args) {
char x = '2';
int y = 0b00001111;
int z = x & y;
Console.WriteLine(z);
}
}
}
메모리에 1바이트의 공간을 확보하기 위해 char
유형 변수 x
와 int
유형 변수 y
를 구성했습니다.
마지막 4비트가 1인 해당 10진수 값의 이진 버전은 0b00001111
로 기록됩니다.
int z= x&y;
라는 줄 비트의 and를 계산하고 그 결과를 z
라는 변수에 저장합니다. z
변수는 int
데이터 유형이므로 십진수 형식으로 표현된 결과를 볼 수 있습니다.
작업은 다음과 같습니다.
x = 01111101
y = 00001111
z = x& y = 00001101
이것이 보이기 때문에 x
변수가 가장 최근의 4비트를 제외하고 모두 제거되었음을 알 수 있습니다. 이를 위해 AND
연산자를 사용했습니다.
마찬가지로 OR
연산자를 사용하여 비트를 결합할 수 있습니다.
이제 비트에 대한 확실한 지식이 있는 경우 비트를 가지고 놀고 암호를 생성하는 것이 이제 간단하다는 것을 알 수 있습니다.
I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.
LinkedIn