마스크(컴퓨팅)
Mask (computing)이 기사는 대부분 또는 전체적으로 단일 출처에 의존하고 있습니다. : · · · · JSTOR (2020년 4월) |
컴퓨터 과학에서 마스크 또는 비트 마스크는 비트 연산, 특히 비트 필드에서 사용되는 데이터입니다.마스크를 사용하여 바이트, 니블, 워드 등의 여러 비트를 켜거나 끌 수 있으며, 단일 비트 작동에서 켜짐에서 꺼짐으로 반전(또는 그 반대)할 수 있습니다.마스킹의 추가 사용에는 벡터 처리에서의 사전 정의가 수반되며, 여기서 비트마스크는 벡터 내의 어떤 요소 연산을 실행할지(마스크 비트가 활성화됨)와 실행하지 않을지(마스크 비트가 클리어됨)를 선택하기 위해 사용됩니다.
공통 비트마스크 기능
비트 마스킹 대상1
특정 비트를 켜려면 다음 원칙에 따라 비트 연산을 사용할 수 있습니다.Y OR 1 = 1
그리고.Y OR 0 = Y
그래서 좀 더 확실히 하기 위해서OR
와 함께 사용할 수 있다1
조금 변하지 않게 하기 위해서OR
와 함께 사용됩니다.0
.
예: 상위 니블(비트 4, 5, 6, 7)을 마스킹하고 하위 니블(비트 0, 1, 2, 3)은 변경하지 않습니다.
100101 10100101 OR 11110000 = 11110101 11110101
비트 마스킹 대상0
실제에서는 비트가 "마스크 오프"되는 경우가 더 많습니다(또는 마스킹 대상).0
(또는 에 마스크됨)이 "on"보다 더 커집니다.1
). 비트가AND
ed가 0이면 결과는 항상 0입니다.Y AND 0 = 0
다른 비트를 원래대로 두려면AND
로 둘러싸인.1
~하듯이Y AND 1 = Y
예: 상위 니블(비트 4, 5, 6, 7)을 마스킹하고 하위 니블(비트 0, 1, 2, 3)은 변경하지 않습니다.
100101 10100101 AND 00001111 = 00000101 00000101
비트 상태 쿼리
비트마스크를 사용하면 다른 비트에 관계없이 개별 비트의 상태를 쉽게 확인할 수 있습니다.이렇게 하려면 비트를 사용하여 다른 모든 비트를 끄십시오.AND
위에서 설명한 바와 같이 실행되며 값은0
이 값이 같은 경우0
비트는 오프였지만 값이 다른 값일 경우 비트는 온이었습니다.이것을 편리하게 하는 것은 실제 가치가 무엇인지 알 필요가 없고, 단지 그렇지 않다는 것이다.0
.
예:네 번째 비트 상태 쿼리
10011101 100101 AND 00001000 = 00001000 00000000
비트 값 전환
지금까지 이 기사에서는 비트를 켜고 끄는 방법에 대해 설명했지만 동시에 둘 다 다루지는 않았습니다.때로는 그 가치가 실제로 중요하지 않을 수 있지만, 현재의 가치와는 반대로 만들어야 합니다.이 작업은 (전용 또는) 연산을 사용하여 수행할 수 있습니다. XOR
돌아온다1
홀수 비트의 수가 비트에 해당하는 경우에만1
따라서 두 개의 대응하는 비트가1
그 결과,0
단, 그 중 하나만1
그 결과는 다음과 같습니다.1
따라서 비트 값의 반전은 다음과 같이 이루어집니다.XOR
을 그들에게 주입하다1
원래 비트가1
, 반환됩니다.1 XOR 1 = 0
원래 비트가0
그것은 되돌아온다0 XOR 1 = 1
또, 주의해 주세요.XOR
마스킹은 비트 세이프입니다.즉, 마스크되지 않은 비트에 영향을 주지 않습니다.Y XOR 0 = Y
에는, 마치...OR
.
예:비트 값 전환
10011101 100101 XOR 000011111111 = 10010010 011010
임의의 1과 0을 비트 서브셋에 쓰려면 먼저 해당 서브셋에 0을 쓴 다음 상위 비트를 설정합니다.
=(register & ~bitmask) 값을 등록합니다.
비트마스크 사용
함수에 대한 인수
C와 같은 프로그래밍 언어에서 비트 필드는 함수에 명명된 부울 인수 집합을 전달하는 유용한 방법입니다.예를 들어 그래픽 API OpenGL에는 다음과 같은 명령어가 있습니다.glClear()
화면 또는 기타 버퍼를 클리어합니다.최대 4개의 버퍼(컬러, 깊이, 축적 및 스텐실 버퍼)를 클리어할 수 있기 때문에 API 작성자는 4개의 인수를 필요로 할 수 있습니다.하지만 그때 전화하면
클리어(1,1,0,0); // 이는 glClear가 실제로 작동하는 방식이 아니며 불안정한 코드를 만듭니다.
설명이 잘 안 되는 부분이죠대신 4개의 필드 비트가 정의되어 있습니다.GL_COLOR_BUFFER_BIT
,GL_DEPTH_BUFFER_BIT
,GL_ACCUM_BUFFER_BIT
,그리고.GL_STENCIL_BUFFER_BIT
그리고.glClear()
로서 선언되다
무효 클리어(GL비트필드 비트);
그러면 함수에 대한 호출은 다음과 같습니다.
클리어(GL_COLOR_BUFFER_BIT부문 GL_DECTH_BUFFER_BIT부문);
내부적으로 이와 같은 비트필드를 사용하는 함수는 바이너리를 사용할 수 있습니다.and
개별 비트를 추출합니다.예를 들어 다음과 같은 구현이 있습니다.glClear()
다음과 같습니다.
무효 클리어(GL비트필드 비트) { 한다면 ((비트 & GL_COLOR_BUFFER_BIT부문) != 0) { // 컬러 버퍼를 클리어합니다. } 한다면 ((비트 & GL_DECTH_BUFFER_BIT부문) != 0) { // 깊이 버퍼를 지웁니다. } 한다면 ((비트 & GL_ACCUM_BUFFER_BIT부문) != 0) { // 누적 버퍼를 지웁니다. } 한다면 ((비트 & GL_STECIL_BUFFER_BIT부문) != 0) { // 스텐실 버퍼를 지웁니다. } }
이 접근방식의 장점은 함수 인수의 오버헤드가 감소한다는 것입니다.최소 데이텀 사이즈는 1바이트이므로 옵션을 다른 인수로 분리하면 인수당7비트가 낭비되고 스택스페이스를 더 많이 차지하게 됩니다.대신 일반적으로 함수는 각각 최대 32비트의 옵션비트를 포함한1개 이상의 32비트 정수를 받아들입니다.이 솔루션은 우아하지만 가장 간단한 구현에서는 타입 세이프가 아닙니다.aGLbitfield
단순한 정의로 정의되어 있다.unsigned int
따라서 컴파일러는 의미 없는 호출을 허용합니다.glClear(42)
또는 심지어glClear(GL_POINTS)
C++에서는 glClear가 받아들일 수 있는 인수 세트를 캡슐화하는 클래스를 생성하여 라이브러리에 깔끔하게 캡슐화할 수 있습니다.
역마스크
마스크는 IP ACL(Access Control Lists)의 IP 주소와 함께 허용 및 거부 대상을 지정하기 위해 사용됩니다.인터페이스에 IP 주소를 설정하려면 , 마스크는 255 로 시작해 왼쪽에 큰 값이 표시됩니다.예를 들면, 255.255.224 마스크의 IP 주소 203.0.123.129 와 같이 됩니다.IP ACL 의 마스크는, 그 반대입니다.예를 들어 mask 0.0.255 입니다.이것은 역마스크 또는 와일드카드 마스크라고도 불립니다.마스크의 값을 바이너리(0과 1)로 분할하면, 그 결과에 의해서, 트래픽의 처리시에 고려할 주소 비트가 정해집니다.0비트는 주소 비트를 고려해야 함을 나타냅니다(정확한 일치). 마스크 내의 1비트는 "상관 없음"입니다.다음 표에서 개념을 자세히 설명합니다.
마스크 예:
네트워크 주소(처리되는 트래픽): 192.0.2.0
마스크: 0.0.0.255
네트워크 주소(표준): 11000000.00000000.00000010.00000000
마스크(표준): 00000000.00000000.00000000.11111111
바이너리 마스크에 근거해, 최초의 3개의 세트(옥텟)가 소정의 바이너리 네트워크주소(11000000)와 정확하게 일치할 필요가 있는 것을 알 수 있습니다.00000000.00000010).마지막 숫자 집합은 "상관없음" (.111111)으로 구성됩니다.따라서 마지막 옥텟은 "Don't care"이므로 "192.0.2"로 시작하는 모든 트래픽이 일치합니다.따라서 이 마스크에서는 네트워크주소 192.0.2.1 ~192.0.2.255(192.0.2.x)가 처리됩니다.
ACL 역마스크를 판별하려면 255.255.255에서 일반 마스크를 빼야 합니다.이 예에서는 네트워크주소 198.51.100.0에 대해서, 통상의 마스크가 255.255.255.0인 역마스크가 결정됩니다.
255.255.255 - 255.255.0(일반 마스크)= 0.0.0.255(표준 마스크)
ACL 등가물
source/source-wildcard 0.0.0/255.255.255는 "임의"를 의미합니다.
198.51.100.2/0.0.0의 소스/와일드카드는, 「host 198.51.100」과 같습니다.2인치
이미지 마스크
컴퓨터 그래픽스에서 특정 이미지가 배경 위에 배치되는 경우 투명 영역을 이진 [1]마스크를 통해 지정할 수 있습니다.이와 같이 의도된 각 이미지에는 실제로 2개의 비트맵이 있습니다.실제 이미지에서는 미사용 영역에 모든 비트가 0으로 설정된 픽셀 값이 부여되며, 대응하는 이미지 영역에는 모든 비트의 픽셀 값이 0으로 설정되고 주변 영역에는 모든 비트의 값이 1로 설정됩니다.오른쪽 예제에서는 검은색 픽셀이 모두 0비트이고 흰색 픽셀이 모두 1비트입니다.
실행 시 화면에 이미지를 배경 위에 놓기 위해 프로그램은 먼저 비트 AND 연산을 사용하여 원하는 좌표에 있는 이미지 마스크로 화면 픽셀의 비트를 마스크합니다.이렇게 하면 투명 영역의 배경 픽셀이 유지되고 겹치는 이미지에 의해 가려지는 픽셀의 비트가 0으로 재설정됩니다.
그런 다음 프로그램은 비트 단위 OR 연산을 사용하여 배경 픽셀의 비트와 결합하여 이미지 픽셀의 비트를 렌더링합니다.이렇게 하면, 픽셀 주위의 배경을 유지하면서, 화상 픽셀이 적절히 배치됩니다.그 결과, 배경에 화상을 완전하게 합성할 수 있습니다.
이 기술은 포인팅 디바이스 커서, 문자, 글머리 기호 등의 일반적인 2-D 비디오 게임, GUI 아이콘 및 비디오 제목 지정 및 기타 이미지 믹싱 응용 프로그램에 사용됩니다.
(같은 목적으로 사용되기 때문에) 관련되지만 투명 색상과 알파 채널은 이진 마스킹에 의한 영상 픽셀 혼합을 수반하지 않는 기술입니다.
해시 테이블
해시 테이블의 해시 함수를 작성하기 위해 도메인이 큰 함수를 사용하는 경우가 많습니다.함수 출력에서 인덱스를 작성하려면 도메인 크기를 배열 크기에 맞게 줄이는 모듈로를 사용할 수 있습니다. 그러나 대부분의 프로세서에서 해시 테이블의 크기를 두 가지 크기의 거듭제곱으로 제한하고 대신 비트마스크를 사용하는 것이 더 빠릅니다.
C의 모듈로와 마스킹의 예를 다음에 나타냅니다.
#실패하다 < stdint >h> #실패하다 <문자열>h> 인트 주된(무효) { 컨스턴트 uint32_t 숫자_버킷 수 = 0xFFFFFFFF; // 2^32 - 1 컨스턴트 uint32_t MAX_RECORDS = 1<< >10; // 2^10 컨스턴트 uint32_t 해시_비트마스크 = 0x3FF; // (2^10)-1 차 **토큰 어레이 = 특수한 순서; // token_array 메모리 할당 처리... 차 상품권[] = "일부 해시 가능한 값"; uint32_t 해시됨_개요 = 해시_함수(상품권, 스트렌(상품권), 숫자_버킷 수); // 모듈로 사용 size_t 색인 = 해시됨_개요 % MAX_RECORDS; // OR // 비트마스크 사용 size_t 색인 = 해시됨_개요 & 해시_비트마스크; *(토큰 어레이+색인) = 상품권; // token_array에서 메모리 해방... 돌아가다 0; }
「 」를 참조해 주세요.
레퍼런스
- ^ "Mask R-CNN with OpenCV". PyImageSearch. 2018-11-19. Retrieved 2020-04-05.