비트 필드
Bit field비트 필드는 특정 목적을 위해 할당된 하나 이상의 인접 비트로 구성된 데이터 구조이며, 구조 내의 단일 비트 또는 비트 그룹을 설정 또는 [1][2]검사할 수 있습니다.비트 필드는 단일 비트 Bohans와 같이 알려진 고정 비트 폭의 정수 유형을 나타내기 위해 가장 일반적으로 사용됩니다.
필드 내의 개별 비트의 의미는 프로그래머에 의해 결정됩니다.예를 들어 비트필드의 첫 번째 비트(필드의 기본 주소에 위치)는 비트필드와 [3]관련된 특정 속성의 상태를 결정하기 위해 사용되는 경우가 있습니다.
CPU 및 기타 논리 디바이스에서는 일반적으로 플래그라고 불리는 비트필드 컬렉션이 특정 [4]동작의 결과를 제어하거나 나타내기 위해 사용됩니다.프로세서에는 플래그로 구성된 상태 레지스터가 있습니다.예를 들면, 덧셈의 결과를 행선지에 나타낼 수 없는 경우는, 산술 오버플로를 설정한다.깃발을 사용하여 조건부 점프 지시와 같은 후속 작업을 결정할 수 있다.예를 들어, x86 어셈블리 언어로 (Jump if Equal) 명령을 실행하면 이전 작업에 의해 Z(제로) 플래그가 설정된 경우 점프가 발생합니다.
비트 필드는 정수에 의해 색인화된 큰 비트 세트를 저장하기 위해 사용되며 종종 언어에 [citation needed]의해 지원되는 어떤 적분형보다 넓다는 점에서 비트 배열과 구별됩니다.반면 비트 필드는 일반적으로 기계어 [3]안에 들어가며 비트의 표시는 수치 [2]인덱스에 의존하지 않습니다.
실행
비트 필드는 프로그램에서 항상 낮은 값을 갖는 다수의 정수 변수를 필요로 할 때 메모리 소비를 줄이기 위해 사용할 수 있습니다.예를 들어, 많은 시스템에서 정수 값을 저장하는 경우 2바이트(16비트)의 메모리가 필요합니다.저장하는 값은 실제로는 1~2비트만 필요할 수 있습니다.이러한 작은 변수들이 비트 필드를 공유하도록 함으로써 메모리 [5]내의 데이터를 효율적으로 패키징할 수 있습니다.
C 및 C++에서는 네이티브 구현 정의 비트필드를 생성할 수 있습니다.unsigned int
,signed int
또는 (C99의 경우)_Bool
이 경우 프로그래머는 여러 서브필드의 [6]너비를 결정하는 비트필드의 구조를 선언할 수 있습니다.컴파일러는 각 '필드'가 별도로 선언될 경우 사용되는 메모리에 비해 동일한 유형의 인접하게 선언된 비트 필드를 단어 수로 압축할 수 있습니다.
네이티브 비트 필드가 없는 언어 또는 프로그래머가 결과 비트 표현을 제어하고 싶은 경우 더 큰 워드 유형 내에서 수동으로 비트를 조작할 수 있습니다.이 경우 프로그래머는 마스킹 [7]연산과 비트 연산을 조합하여 필드의 비트를 설정, 테스트 및 변경할 수 있습니다.
예
C 프로그래밍 언어
// 불투명 및 표시 #정의 YES 1 #정의 NO 0 // 라인 스타일 #솔리드 1의 정의 #도트 포함 2의 #정의 DASH 3 // 원색 #정의 블루 0b100 #정의 그린 0b010 #빨간색 정의 0b001 // 혼합 색상 #검정색 0 정의/* 000 */ #정의 황색(빨간색)/* 011 */ #마젠타 정의(빨간색)/* 101 */ #시안의 정의(녹색)/* 110 */ #흰색 정의(빨간 녹색 파란색)/* 111 */ 컨스턴트 차* 색채[8] = {"검은색", "빨간색", "녹색", "노란색", '파랑', '마젠타", "Cyan", "흰색"}; // 비트 필드 상자 속성 구조 박스 프롭 { 서명되어 있지 않다 인트 불투명한 : 1; 서명되어 있지 않다 인트 fill_color(채우다)_color(채움색) : 3; 서명되어 있지 않다 인트 : 4; // 8비트로 채우기 서명되어 있지 않다 인트 show_border : 1; 서명되어 있지 않다 인트 border_color(경계색) : 3; 서명되어 있지 않다 인트 border_style : 2; 서명되어 있지 않다 차 : 0; // 가장 가까운 바이트까지 채우기(16비트) 서명되어 있지 않다 차 폭 : 4, // 바이트를 4비트의 2필드로 분할합니다. 높이 : 4; };
C의 비트필드 레이아웃struct
는 구현 정의되어 있습니다.컴파일러 전체에서 예측 가능한 동작을 유지하려면 기본 및 비트 연산자를 사용하여 비트 필드를 에뮬레이트하는 것이 좋습니다.
/* 각 프리프로세서 디렉티브는 1비트를 정의합니다. 컨트롤러의 1개의 버튼에 대응합니다. 버튼 순서는 닌텐도 엔터테인먼트 시스템과 일치합니다.*/ #정의키_RIGHT 0b00000001 #정의 키_왼쪽 0b00000010 #정의키_DOWN 0b00 #정의 키_업 0b00001000 #정의키_START 0b00010000 #정의키_SELECT 0b00100000 #정의키_B 0b01000000 #정의 키_A 0b10000000 인트 게임 컨트롤러 상태 = 0; /* OR */을 사용하여 gameController Status를 설정합니다. 무효 키 누르기( 인트 열쇠 ) { 게임 컨트롤러 상태 = 열쇠; } /* AND 및 ~ (바이너리 NOT)*/ 를 사용하여 game Controller Status 를 클리어 합니다. 무효 키 릴리즈( 인트 열쇠 ) { 게임 컨트롤러 상태 &= ~열쇠; } /* AND */를 사용하여 비트가 설정되어 있는지 테스트합니다. 인트 IsPressed(압축)( 인트 열쇠 ) { 돌아가다 게임 컨트롤러 상태 & 열쇠; }
프로세서 상태 레지스터
프로세서의 상태 레지스터는 여러 개의 플래그 비트로 구성된 비트 필드입니다.각 플래그 비트는 프로세서의 현재 [8]상태에 대한 정보를 나타냅니다.예를 들어, 6502 프로세서의 상태 레지스터는 다음과 같습니다.
비트 7 | 비트 6 | 비트 5 | 비트 4 | 비트 3 | 비트 2 | 비트 1 | 비트 0 |
---|---|---|---|---|---|---|---|
네거티브 | oVerflow 플래그 | - | 브레이크 플래그 | 십진수 플래그 | 인터럽트 디세이블플래그 | 제로 플래그 | 반송 플래그 |
이러한 비트는 연산 결과에 따라 프로세서에 의해 설정됩니다.특정 비트(Carry, Interrupt-disable, Decimal 플래그 등)는 설정 및 클리어 지침을 사용하여 명시적으로 제어할 수 있습니다.또, 분기 명령도, 플래그의 현재 상태에 근거해 실행을 변경하도록 정의된다.
예를 들어, 다음에ADC
(캐리와 함께 추가) 지침,BVS
(oVerflow 세트의 분기) 명령은 추가 명령 결과에 따라 프로세서에 의해 오버플로 플래그가 설정되었는지 여부에 따라 점프하기 위해 사용될 수 있습니다.
플래그 워드에서 비트 추출
마스크에 의한 ANDing에 의해 플래그 필드의 플래그 서브셋을 추출할 수 있다.다수의 언어가 시프트 연산자(<<)를 지원하고 있습니다.1 << n
단일 비트를 n번째 위치에 정렬합니다.또한 대부분은 AND 연산자(&)를 사용하여 1개 이상의 비트의 값을 분리할 수도 있습니다.
디바이스로부터의 상태 바이트가 0x67이고 5번째 플래그 비트가 데이터 레이디임을 나타내는 경우.마스크 바이트는 2 202^{5}=상태 바이트 0x67(0110 0111
마스크 바이트 0x20(이진수)을 사용하여0010 0000
0x20으로 평가됩니다.즉, 플래그 비트가 설정되어 있습니다.즉, 디바이스는 데이터 레이디입니다.플래그 비트가 설정되어 있지 않은 경우, 이 값은 0으로 평가됩니다.즉, 디바이스에서 사용할 수 있는 데이터가 없습니다.
변수 v에서 n번째 비트를 확인하려면 다음 작업을 수행합니다.
bool nth_is_set = (v & (1 < n)!= 0; bool nth_is_set = (v > n) & 1;
플래그 워드의 비트 변경
플래그의 비트 쓰기, 읽기 또는 전환은 OR, AND 및 NOT 연산(프로세서에서 빠르게 수행할 수 있는 연산)을 통해서만 수행할 수 있습니다.비트 또는 상태 바이트를 마스크 바이트로 설정하려면마스크 바이트 또는 상태 바이트에 설정된 모든 비트가 결과에서 설정됩니다.
비트를 전환하려면 상태 바이트와 마스크 바이트를 XOR합니다.그러면 클리어되면 비트가 설정되고 설정되어 있으면 비트가 삭제됩니다.
「 」를 참조해 주세요.
- 바이너리 코드
- 체스 및 유사한 게임에 사용되는 비트보드
- 비트 배열(또는 비트 문자열)
- Word(컴퓨터 아키텍처)
- 마스크(컴퓨팅)
- 프로그램 상태 단어
- 상태 레지스터
- FLAGS 레지스터(계산)
- 제어 레지스터
레퍼런스
- ^ Penn Brumm; Don Brumm (August 1988). 80386 Assembly Language: A Complete Tutorial and Subroutine Library. McGraw-Hill School Education Group. p. 606. ISBN 978-0-8306-9047-3.
- ^ a b Steve Oualline (1997). Practical C Programming. "O'Reilly Media, Inc.". pp. 403–. ISBN 978-1-56592-306-5.
- ^ a b Michael A. Miller (January 1992). The 68000 Microprocessor Family: Architecture, Programming, and Applications. Merrill. p. 323. ISBN 978-0-02-381560-7.
- ^ Ian Griffiths; Matthew Adams; Jesse Liberty (30 July 2010). Programming C# 4.0: Building Windows, Web, and RIA Applications for the .NET 4.0 Framework. "O'Reilly Media, Inc.". pp. 81–. ISBN 978-1-4493-9972-6.
- ^ Tibet Mimar (1991). Programming and Designing with the 68000 Family: Including 68000, 68010/12, 68020, and the 68030. Prentice Hall. p. 275. ISBN 978-0-13-731498-0.
- ^ a b Prata, Stephen (2007). C primer plus (5th ed.). Indianapolis, Ind: Sams. ISBN 978-0-672-32696-7.
- ^ Mark E. Daggett (13 November 2013). Expert JavaScript. Apress. pp. 68–. ISBN 978-1-4302-6097-4.
- ^ InCider. W. Green. January 1986. p. 108.
외부 링크
- 책에서의 설명
- 다른 Wiki의 설명
- C++ 가이드의 사용 사례
- C++ libbit 라이브러리(대체 URL)
- Bit Twiddling Hacks: 비트필드를 조작하는 C코드의 몇 가지 단편