맨위로가기

마스크 (컴퓨팅)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

비트 마스크는 컴퓨터의 각 비트를 개별적으로 조작하기 위한 기술로, 비트 단위 연산을 활용한다. 비트 마스크는 특정 비트를 1로 설정(켜기), 0으로 설정(끄기), 또는 상태 확인 및 반전하는 데 사용된다. 이러한 기능은 함수의 인수 전달, 해시 테이블 구현, 이미지 마스크 처리, 역 마스크 사용 등 다양한 분야에서 활용된다. 특히, C 언어와 같은 프로그래밍 언어에서 함수의 불리언형 인수를 효율적으로 전달하거나, 그래픽스 API에서 여러 버퍼를 동시에 제어하는 데 유용하게 사용된다. 또한, IP ACL에서 네트워크 주소를 필터링하거나, 컴퓨터 그래픽스에서 이미지의 투명 영역을 처리하는 데에도 활용된다.

더 읽어볼만한 페이지

마스크 (컴퓨팅)

2. 비트마스크의 기본 연산

비트마스크는 주로 논리 연산(AND, OR, XOR)을 사용하여 특정 비트를 조작한다.


  • 특정 비트 켜기: 논리합(`OR`) 연산(비트 OR)을 사용한다. `1`과의 `OR` 연산은 항상 `1`이 되고, `0`과의 `OR` 연산은 원래 상태를 유지한다. 따라서 켜고 싶은 비트는 `1`, 유지할 비트는 `0`으로 설정된 마스크를 사용한다.
  • 특정 비트 끄기: 논리곱(`AND`) 연산(비트 AND)을 사용한다. `0`과의 `AND` 연산은 항상 `0`이 되고, `1`과의 `AND` 연산은 원래 상태를 유지한다. 따라서 끄고 싶은 비트는 `0`, 유지할 비트는 `1`로 설정된 마스크를 사용한다.
  • 비트 상태 확인: 비트 단위 `AND` 연산을 사용하여 확인할 비트만 남기고 나머지 비트는 모두 `0`으로 만든다. 결과 값이 `0`이면 해당 비트는 꺼져 있는 것이고, `0`이 아니면 켜져 있는 것이다.
  • 비트 반전: 배타적 논리합(`XOR`) 연산을 사용한다. `XOR`는 두 비트 중 하나만 `1`일 때 `1`을 반환한다. 반전시키고 싶은 비트는 `1`로 설정된 마스크와 `XOR` 연산을 수행한다.

2. 1. 비트를 1로 설정 (Masking bits to 1)

특정 비트를 '켜기' 위해서는 비트 연산 `OR`을 사용한다. `Y OR 1 = 1`이고 `Y OR 0 = Y`라는 원리에 따라, 비트를 켜려면 `1`과 `OR` 연산을 하고, 변경하지 않으려면 `0`과 `OR` 연산을 하면 된다.

예: 상위 니블(비트 4, 5, 6, 7)을 "on"으로 마스킹하고, 하위 니블(비트 0, 1, 2, 3)은 변경하지 않는 경우:

```

10010101 10100101

OR 11110000 11110000

= 11110101 11110101

```

예: LSB에서 4번째 비트를 켜는 경우:

```

10011101 10010101 마스크될 2바이트

OR 00001000 00001000 마스크할 2바이트

= 10011101 10011101 마스크된 결과

2. 2. 비트를 0으로 설정 (Masking bits to 0)

특정 비트를 '끄기' 위해서는 대상 비트에 대해 논리곱(AND) 연산을 사용한다. 비트가 0과 함께 `AND` 처리될 때 결과는 무조건 0이다. (예: `Y AND 0 = 0`) 원래 있던 것처럼 다른 비트들을 남겨두려면 `Y AND 1 = Y`가 되므로 `1`과 함께 `AND` 처리할 수 있다.

예: 더 높은 니블(비트 4, 5, 6, 7)을 "off"로 마스킹하고, 더 낮은 니블(비트 0, 1, 2, 3)은 변경되지 않게 하기

```

10100101 10100101

AND 00001111 00001111

= 00000101 00000101

```

예: LSB에서 4번째 비트를 끄기

```

10011101 10010101 마스크된 2바이트

AND 11110111 11110111 마스크할 2바이트

= 10010101 10010101 마스크된 결과

2. 3. 비트 상태 확인 (Querying the status of a bit)

비트 마스크를 사용하면 다른 비트와 관계없이 개별 비트의 상태를 쉽게 확인할 수 있다. 이를 위해 비트 단위 `AND` 연산을 사용하여 다른 모든 비트를 끄고, 그 값을 `0`과 비교한다. 만약 `0`과 같다면 해당 비트는 꺼져 있는 것이고, 다른 값이라면 해당 비트는 켜져 있는 것이다. 이 방식이 편리한 점은 실제로 어떤 값인지 알아낼 필요 없이, `0`이 아니라는 것만 확인하면 된다는 것이다.

예시: LSB부터 4번째 비트의 상태 확인

1001110110010101마스크될 2바이트
AND 00001000AND 00001000주목할 비트만 1로 설정한 마스크 2바이트
= 00001000= 00000000마스크된 결과


2. 4. 비트 반전 (Toggling bit values)

특정 비트의 값을 반전시키기 위해 XOR 연산을 사용한다. (Y XOR 1 = NOT Y, Y XOR 0 = Y) 예를 들어, 어떤 비트 열이 주어졌을 때, 이 비트 열의 모든 비트 값을 반전시키려면, 모든 비트가 1인 비트 열과 XOR 연산을 수행하면 된다. 원래 비트가 1이면 1 XOR 1 = 0 이 되고, 원래 비트가 0이면 0 XOR 1 = 1 이 된다.

예: 모든 비트를 반전

비고
1001110110010101반전 전 2바이트
XOR 1111111111111111반전시키기 위해 모두 1의 2바이트
= 0110001001101010반전된 결과


3. 비트마스크의 활용

C 언어와 같은 프로그래밍 언어에서 비트 마스크는 함수의 불리언형 인수를 이름 붙은 값들의 집합으로 전달하는 데 사용될 수 있다. 예를 들어, 그래픽스 API인 OpenGL에는 화면이나 다른 버퍼를 지우는 `glClear()` 명령어가 있다. 이 명령어는 색상, 깊이, 누적, 스텐실의 네 가지 버퍼를 지울 수 있다.

`glClear()` 함수는 다음과 같이 선언된다.

```c

void glClear(GLbitfield bits);

```

함수 호출은 다음과 같이 간단하게 표현할 수 있다.

```c

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

```

함수 내부에서는 `AND` 연산을 사용하여 개별 비트를 추출한다.

이 기법은 인수 개수를 줄여 오버헤드를 줄일 수 있다는 장점이 있다. 그러나 단순 구현에서는 타입 안전성이 보장되지 않아 컴파일러가 잘못된 호출을 잡아내지 못할 수 있다. C++(C++)에서는 클래스를 이용하여 타입 안전성을 확보할 수 있다.

3. 1. 함수의 인수 (Arguments to functions)

프로그래밍 언어인 C와 같은 언어에서 비트 필드는 명명된 불리언 인수를 함수에 전달하는 유용한 방법이다. 예를 들어, 그래픽 API인 OpenGL에는 화면이나 다른 버퍼를 지우는 glClear() 명령어가 있다. 최대 4개의 버퍼(스텐실 버퍼를 포함한 색상, 깊이, 누적)를 지울 수 있다. API 작성자는 4개의 인수를 받도록 할 수 있었지만, 그렇게 하면 호출은 다음과 같이 될 것이다.

```c

glClear(1,1,0,0); // glClear가 실제로 작동하는 방식이 아니며 불안정한 코드를 만듭니다.

```

이는 그다지 설명적이지 않다. 대신 GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT의 네 개의 정의된 필드 비트가 있으며 glClear()는 다음과 같이 선언된다.

```c

void glClear(GLbitfield bits);

```

그러면 함수 호출은 다음과 같다.

```c

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

```

내부적으로, 이와 같이 비트 필드를 사용하는 함수는 개별 비트를 추출하기 위해 바이너리 and를 사용할 수 있다. 예를 들어, glClear()의 구현은 다음과 같다.

```c

void glClear(GLbitfield bits) {

if ((bits & GL_COLOR_BUFFER_BIT) != 0) {

// 색상 버퍼를 지웁니다.

}

if ((bits & GL_DEPTH_BUFFER_BIT) != 0) {

// 깊이 버퍼를 지웁니다.

}

if ((bits & GL_ACCUM_BUFFER_BIT) != 0) {

// 누적 버퍼를 지웁니다.

}

if ((bits & GL_STENCIL_BUFFER_BIT) != 0) {

// 스텐실 버퍼를 지웁니다.

}

}

```

이러한 접근 방식의 장점은 함수 인수의 오버헤드가 감소한다는 것이다. 최소 데이터 크기는 1바이트이므로 옵션을 별도의 인수로 나누면 인수당 7비트가 낭비되고 더 많은 스택 공간을 차지하게 된다. 대신 함수는 일반적으로 각각 최대 32개의 옵션 비트가 있는 하나 이상의 32비트 정수를 허용한다. 우아하지만 가장 간단한 구현에서 이 솔루션은 타입 안전하지 않다. GLbitfield는 단순히 unsigned int로 정의되므로 컴파일러는 glClear(42) 또는 glClear(GL_POINTS)에 대한 무의미한 호출을 허용한다. C++(C++)에서는 glClear가 허용할 수 있는 인수 집합을 캡슐화하고 라이브러리에 깔끔하게 캡슐화될 수 있는 클래스를 생성하는 것이 대안이 될 수 있다.

3. 2. 해시 테이블 (Hash tables)

해시 테이블을 위한 해시 함수를 생성할 때, 큰 정의역을 가진 함수가 종종 사용된다. 함수의 출력에서 인덱스를 생성하기 위해 모듈로 연산을 수행하여 정의역의 크기를 배열의 크기에 맞게 줄일 수 있다. 하지만 많은 프로세서에서는 해시 테이블의 크기를 2의 거듭제곱으로 제한하고 비트 마스크를 사용하는 것이 더 빠르다.

나머지를 구하는 계산은 비트 연산보다 일반적으로 느리다. 법이 2의 거듭제곱(2n)일 때는, 단순히 `2^n - 1`로 비트 마스크를 하면 된다. 예시는 다음과 같다.

  • 13 MOD 4 = 1 (13을 4로 나눈 나머지는 1과 같다)
  • 1101 AND 0011 = 0001 (비트 마스크에 의한 나머지)


실용적인 예로, 해시 테이블을 위한 해시 함수가 있다. 해시 함수에는 큰 정의역의 함수가 자주 사용되지만, 해시 값으로부터 해시 테이블의 인덱스를 얻기 위해서는 합동식 연산을 수행하여 배열의 크기에 맞게 조정해야 한다. 배열의 크기를 2의 거듭제곱으로 해두면, 이 나머지 연산을 고속화할 수 있다.

3. 3. 이미지 마스크 (Image masks)

컴퓨터 그래픽스에서 주어진 이미지를 배경 위에 배치할 때, 투명 영역은 이진 마스크를 통해 지정할 수 있다.[1] 이러한 방식으로 각 대상 이미지에 대해 두 개의 비트맵이 사용된다. 하나는 사용하지 않는 영역에 모든 비트가 0으로 설정된 픽셀 값을 지정하는 실제 이미지이고, 다른 하나는 해당 이미지 영역에 모든 비트가 0으로 설정된 픽셀 값을, 주변 영역에 모든 비트가 1로 설정된 픽셀 값을 지정하는 ''마스크''이다.

런타임에 이미지를 배경 위에 표시하려면, 프로그램은 먼저 비트 단위 AND 연산을 사용하여 이미지 마스크로 화면 픽셀의 비트를 마스크한다. 이렇게 하면 투명 영역의 배경 픽셀은 유지되고 겹쳐진 이미지에 의해 가려질 픽셀의 비트는 0으로 재설정된다.

그런 다음 프로그램은 비트 단위 OR 연산을 사용하여 이미지 픽셀의 비트를 배경 픽셀의 비트와 결합하여 렌더링한다. 이러한 방식으로 이미지 픽셀은 적절하게 배치되고 주변 배경 픽셀은 보존된다. 그 결과 배경 위의 이미지의 완벽한 합성이 이루어진다.

이 기술은 포인팅 장치 커서, 캐릭터, 총알 등 (스프라이트)과 같은 일반적인 2D 비디오 게임, GUI 아이콘, 비디오 타이틀링 및 기타 이미지 혼합 애플리케이션에 사용된다.

투명 색상 및 알파 채널은 이진 마스킹에 의한 이미지 픽셀 혼합을 포함하지 않는 기술이지만, 동일한 목적으로 사용되기 때문에 관련이 있다.

3. 4. 역 마스크 (Inverse masks)

마스크는 IP ACL(접근 제어 목록)에서 허용 및 거부할 항목을 지정하기 위해 IP 주소와 함께 사용된다. 인터페이스에서 IP 주소를 구성하기 위한 마스크는 255로 시작하며 왼쪽에 큰 값을 갖는다. IP ACL용 마스크는 이와 반대이다. 예를 들어, 마스크는 역 마스크 또는 와일드카드 마스크라고 불린다.

마스크 값을 이진수(0과 1)로 나타내면 트래픽을 처리할 때 어떤 주소 비트를 고려해야 하는지 결정된다. '0' 비트는 주소 비트를 고려해야 함을 나타내고(정확히 일치), 마스크의 '1' 비트는 "무시"를 의미한다.
마스크 예시

항목설명
네트워크 주소 (처리할 트래픽)
마스크
네트워크 주소 (이진수)11000000.00000000.00000010.00000000
마스크 (이진수)00000000.00000000.00000000.11111111



이진 마스크를 기반으로 처음 세 세트(옥텟)은 주어진 이진 네트워크 주소(11000000.00000000.00000010)와 정확히 일치해야 한다. 마지막 세트는 "무시"(.11111111)로 구성된다. 따라서 마지막 옥텟이 "무시"이므로 로 시작하는 모든 트래픽이 일치한다. 결과적으로 이 마스크를 사용하면 부터 ()까지의 네트워크 주소가 처리된다.

ACL 역 마스크를 결정하려면 에서 일반 마스크를 뺀다.
예시:


  • (일반 마스크) = (역 마스크)

ACL 해당 항목

  • 의 소스/소스-와일드카드는 "모두"를 의미한다.
  • 의 소스/와일드카드는 "호스트 "와 같다.

3. 5. 기타 응용

어떤 숫자가 적힌 카드에 따라 숫자를 맞추는 마술은 숫자의 이진수 표현의 비트를 사용합니다. SVG 파일에서 카드를 클릭하여 토글할 수 있습니다.

참조

[1] 웹사이트 Mask R-CNN with OpenCV https://www.pyimages[...] 2018-11-19
[2] 웹사이트 ビットマスクとは - 意味をわかりやすく - IT用語辞典 e-Words https://e-words.jp/w[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com