비트 필드

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 프로그래밍 언어

C 및 C++[6]의 비트필드 선언:

// 불투명 및 표시 #정의 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 프로세서의 상태 레지스터는 다음과 같습니다.

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 00000x20으로 평가됩니다.즉, 플래그 비트가 설정되어 있습니다.즉, 디바이스는 데이터 레이디입니다.플래그 비트가 설정되어 있지 않은 경우, 이 값은 0으로 평가됩니다.즉, 디바이스에서 사용할 수 있는 데이터가 없습니다.

변수 v에서 n번째 비트를 확인하려면 다음 작업을 수행합니다.

bool nth_is_set = (v & (1 < n)!= 0; bool nth_is_set = (v > n) & 1;

플래그 워드의 비트 변경

플래그의 비트 쓰기, 읽기 또는 전환은 OR, AND 및 NOT 연산(프로세서에서 빠르게 수행할 수 있는 연산)을 통해서만 수행할 수 있습니다.비트 또는 상태 바이트를 마스크 바이트로 설정하려면마스크 바이트 또는 상태 바이트에 설정된 모든 비트가 결과에서 설정됩니다.

비트를 전환하려면 상태 바이트와 마스크 바이트를 XOR합니다.그러면 클리어되면 비트가 설정되고 설정되어 있으면 비트가 삭제됩니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ 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.
  2. ^ a b Steve Oualline (1997). Practical C Programming. "O'Reilly Media, Inc.". pp. 403–. ISBN 978-1-56592-306-5.
  3. ^ a b Michael A. Miller (January 1992). The 68000 Microprocessor Family: Architecture, Programming, and Applications. Merrill. p. 323. ISBN 978-0-02-381560-7.
  4. ^ 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.
  5. ^ 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.
  6. ^ a b Prata, Stephen (2007). C primer plus (5th ed.). Indianapolis, Ind: Sams. ISBN 978-0-672-32696-7.
  7. ^ Mark E. Daggett (13 November 2013). Expert JavaScript. Apress. pp. 68–. ISBN 978-1-4302-6097-4.
  8. ^ InCider. W. Green. January 1986. p. 108.

외부 링크