2009-12-12 3 views
5

). a = 8, b = 2의 두 정수가 있다고 가정합니다. C++에서는 | a | b가 참입니다. 그 동작을 사용하여 플래그 컬렉션을 작업했습니다. 예를 들어, 플래그는 1, 2, 4, 8 등이 될 수 있으며, 이들의 콜렉션은 고유합니다. 나는 C#에서 그렇게하는 법을 찾을 수 없다. & 연산자는 C++에서와 같이 작동하지 않습니다. C#에서 연산자에 대한 설명서를 읽었지만 여전히 이해가 가지 않습니다.비트 단위 Or : C# 대 C++

는 편집 :

불행하게도, 어디 선가 엉망 일을 보인다. 이 코드를 예로 들면 다음과 같습니다.

byte flagCollection = 8; 
byte flag = 3; 

if ((flag | flagCollection) != 0) MessageBox.Show("y"); else MessageBox.Show("n"); 

플래그를 넣은 값이 "y"이면이 값을 반환합니다. 3 | 8은 11이 될 것입니다. 흠 ... 나는 플래그 컬렉션을 가지고 있습니다 : 1, 2, 4, 8, 16 그리고 플래그를 결정할 수 있도록 숫자를 줄 때.

답변

14

&| 연산자는 C/C와 동일합니다 ++. 는 예를 들어, 10 2 | 8이고 2 & 8 차이가 int 자동 부울 값처럼 취급되지 않는다는 0

이다. intbool은 C#에서 고유 한 유형입니다. intint을 비교하여 bool을 얻어야합니다.

if (2 & 8) ...   // doesn't work 

if ((2 & 8) != 0) ... // works 
+0

Any1은이 용도로 사용됩니까? –

+0

'int'는'bool' 타입이 없기 때문에 C++에서'bool'로 변환되지 않습니다.'int'는'bool'으로 사용됩니다. – Noldorin

+6

@ Noldorin : 아닙니다 - C (C99 이전)에는 bool 유형이 없었으며 한 번에 (표준화가 잘되기 전에) C++도 마찬가지 였지만 C는 bool (기술적으로는 _Bool이라고 함)을 가지고있었습니다. C++은 그보다 더 오래 걸렸습니다. –

8

C#에서 다른 비트 및/또는 연산자가 아닙니다. C++에서와 거의 동일하게 작동합니다. 차이점은 C#에서는 정수에서 부울로 암시 적으로 변환되지 않는다는 것입니다.

이 문제를 해결하려면 당신은 제로로 비교해야 : C#에서

if ((a | b) != 0) { 
    ... 
5

는 C/C++과는 달리, C#을 산술 및 부울 사이의 작동에 매우 엄격한 분리를 유지한다.

C#의 설계자는 정수 계열 형식을 부울 값으로 자동 변환하는 것을 C#이 가지고 있지 않은 오류의 원인으로 생각 했으므로 명시 적으로 산술 결과를 부울 결과로 만들어야합니다. 비교 :

if ((a | b) != 0) { 
    // ... 
} 

나는 그것뿐만 아니라 C/C++에서이 작업을 수행하려면 아마 나쁜 생각이 아니다 생각하지만, 나는 확실히 엄격하게 그 조언을 따르지 않는 것을 인정한다 (그리고 나는가 주장하지 않을 그것은 매우 어렵다).