2009-07-26 1 views
1

의미 : 우리가 높은 값과 낮은 값을 갖는 8 바이트 변수를 가지고 있다고 가정 해보십시오. 하나의 포인터는 상위 4 바이트를 가리키고 다른 하나는 하위 4 바이트를 가리킬 수 있고 문제없이 값을 설정/검색 할 수 있습니다. 이제 바이트보다 작은 값을 가져 오거나 설정하는 방법이 있습니까? 두 개의 4 바이트 "변수"로 나누는 대신, 나는 bool을 사용할 수있는 8 개의 1 바이트 변수를 고려하고 싶지만 C#에서는 작은 변수가 정의되어 있지 않습니다. 포인터로 포인터를 16으로 나눌 수 있습니까? 아니면 심지어 32, 64? 그것은 옳지 않을까요?(C#) 포인터를 통해 단일 비트의 값을 설정하는 방법이 있습니까?

이것은 꽤 학문적 인 질문입니다.이 작업은 bitshiffting, unions (Struct.Explicit) 등에서 다르게 수행 할 수 있습니다. 감사합니다.

답변

2

아니요, C#은 비트 필드를 지원하지 않으며 바이트는 주소 지정 가능한 최소 메모리 양입니다. 수동으로 하나 개 또는 여러 개의 특정 비트를 변경 특성을 제공 할 수 있지만 논리를 스스로 풀고/포장을 제공해야 : 그런데

public bool Bit5 { 
    get { return (field & 32) != 0; } 
    set { if (value) field |= 32; else field &= ~32; } 
} 

을, 나는 당신이 최소 FieldOffsetLayoutKind.Explicit을 사용하여 달성 방법을 모르는 당신 지정할 수있는 것은 바이트입니다.

부수적으로, 비트 필드로 이것을 할 수있는 C++조차도 bitwise 트릭을 숨기고 컴파일러가 대신합니다. 적어도 x86 아키텍처에서는 메모리에서 레지스터에 이르는 바이트를 잡을 수는 없습니다.

+0

흠, 코드를 설명해 주시겠습니까? 비트 조작에 대해 많이 이해하지 못합니다. 나는 "field & 32"를 이해할 수 있지만! = 0이 아닙니다. –

+1

'32'는'2^5 = 100000'입니다. 비트와 필드와 32의 결과가 0이면 비트 5는 0이어야합니다. 그렇지 않으면 1이어야합니다. –

+0

아, 네. 그건 분명했습니다. 감사! –

관련 문제