2014-11-26 2 views
1

16 가지 종류의 데이터를 추출 할 수있는 하드웨어에 대한 프로토콜 안내서가 있습니다. 모든 데이터를 표시하려면 65535를 마스크로 입력합니다.비트 마스크의 값 결정

2^0 (1) 
+ 2^1 (2) 
+ 2^2 (4)  
...  
+ 2^15 (32768) 
============== 
65535 
내가 지금은 옵션 9, 10을 필요로 표시 할 필요가

, 및 13. 아마도 나는 단순히 다음과 같은 계산을 사용할 필요가 : 여기 오프베이스 해요 경우 (

2^9 (512) 
+ 2^10 (1024) 
+ 2^13 (8192) 
============== 
9728 

을, 또는 이것을 할 수있는 프로그래밍 방식이 있습니다. 알고 싶습니다.)

내가 알고 싶은 것은 나중에 합계에 포함 된 모든 숫자를 추출하는 방법입니다.

나는 (9728 & 9) == 9, (9728 & 10) == 10(9728 & 13) == 13으로 확인할 수 있다고 생각했지만 모두 false를 반환합니다.

+1

9 대신 2^9를 사용하여 bitwise를 수행하고 2^9와 비교해야합니다. – juharr

+1

'<<'를 사용해보세요. '2 ** 9 == 1 << 9, 2 ** 13 == 1 << 13' –

답변

6

비트 9는 256이고; 비트 10은 512이다. 다음

[Flags] 
public enum MyFlags { 
    None = 0, 
    Foo = 1, 
    Bar = 2, 
    ... 
    SomeFlag = 256, 
    AnotherFlag = 512, 
    ... 
} 

:

MyFlags flags = (MyFlags)val; 
if((flags & MyFlags.SomeFlag) != 0) {/* SomeFlag is set */} 

와 마찬가지로 :

MyFlags thingsWeWant = MyFlags.Foo | MyFlags.SomeFlag | MyFlags.AnotherFlag; 
int val = (int)thingsWeWant; 

if((val & 256) != 0) { /* bit 9 is set */ } 
if((val & 512) != 0) { /* bit 10 is set */ } 
if((val & 4096) != 0) { /* bit 13 is set */ } 

당신은 또한 편의를 위해 열거를 사용할 수 있습니다 비트 (13)는 그래서 4096

입니다

+2

플래그 열거 형을 사용하는 경우 수동으로 "and-ing"대신 "HasFlag' 메서드를 사용할 수 있습니다. –

+0

@SebastianNegraszus 실제로 좋지 않습니다. 'HasFlag'는'Enum'을 사용합니다 - 그래서 * boxing *을 포함합니다. –

2

이런 뜻입니까?

var value = 512 | 1024 | 8192; 

var pos = 9; 
var isSetNine = (value & (1 << pos)) != 0; 
+0

'pos' 변수는 무엇을 의미합니까? –

+0

@MisterEpic 확인하고 싶은 비트의 위치 (2의 거듭 제곱). 그것은 당신의 표본과 같이 9, 10 또는 13 일 것입니다. –