2015-01-18 1 views
3

에 값을 저장하는 스위프트와 비트 필드를 사용합니다 : 어떻게 이런 식으로 뭔가를 할 수 C</strong><strong>에서 1 개 이상의 비트

struct byte_nibbles { 
    unsigned char b1: 4; 
    unsigned char b2: 4; 
    unsigned char b3: 4; 
    unsigned char b4: 4; 
    unsigned char b5: 4; 
    unsigned char b6: 4; 
    unsigned char b7: 4; 
    unsigned char b8: 4; 
}; 

union { 
    unsigned long var; 
    struct byte_nibbles b; 
} 
u; 

int main(void) 
{ 
    u.b.b1=0x01; u.b.b2=0x02; u.b.b3=0x03; u.b.b4=0x04; 
    u.b.b5=0x05; u.b.b6=0x06; u.b.b7=0x07; u.b.b8=0x08; 
    return 0; 
} 

그래서 나는 byte_nibbles의 특정 부분에 액세스 할 수 있습니다. 분명히 이것은 단지 하나의 예일뿐입니다. 기본 유형에 맞는 크기의 비트 필드를 만들 수 있습니다.

내 노력과 많은 연구에도 불구하고 이것을 수행하는 방법을 알 수 없었지만 스위프트. 동일한 결과를 얻으려면 비트 단위로 사용할 수 있지만 읽기 쉽고 우아하지는 않습니다.

아이디어가 있으십니까?

답변

4

스위프트 단순히 당신이 단지

  • 는 (귀하의 경우 Int8에) 대신 다음으로 큰 정수 유형을 사용할 수 있도록, 비트 필드를를 지원하고 변수가 더 많은 메모리를 필요 을 승인하거나
  • 하지 않습니다
  • 비트 조작을 사용하여 정수의 다른 부분에 액세스하십시오.

두 번째 경우를 들어 사용자 정의 계산 속성이 액세스 완화 정의 할 수 있습니다. 예를 들면 다음과 같습니다.

extension UInt8 { 
    var lowNibble : UInt8 { 
     get { 
      return self & 0x0F 
     } 
     set(newValue) { 
      self = (self & 0xF0) | (newValue & 0x0F) 
     } 
    } 

    var highNibble : UInt8 { 
     get { 
      return (self & 0xF0) >> 4 
     } 
     set(newValue) { 
      self = (self & 0x0F) | ((newValue & 0x0F) << 4) 
     } 
    } 
} 


var byte : UInt8 = 0 
byte.lowNibble = 0x01 
byte.highNibble = 0x02 
print(byte.lowNibble) 
print(byte.highNibble) 
+0

저는 Chip-8 VM을 작성하고 있습니다. 그렇다면 비트 연산을 사용하여 정수의 다른 부분에 액세스해야합니다. 당신의 도움을 주셔서 감사합니다. –

+0

Martin, Swift 2.1이 이제 비트 필드를 지원합니다 – dcunited001

+1

@ dcunited001 : 올바르게 기억하면 비트 필드가 C에서 가져온 구조체에서 지원되지만 Swift에서 직접 정의 할 수는 없습니다. –