2012-10-07 2 views
0

광산 실험을 시작하는 데 약간의 문제가 있습니다. 이 연구소는 다음과 같은 지침이 있습니다열거 형을 사용한 비트 연산

감안할 값은 개인 좋아하는 스포츠 결정 int input = 0b10010110. 이 입력에 오류가 없다고 가정합니다. 왼쪽에서부터 오른쪽의 각 위치는 미식 축구, 야구, 배구, 수영, 소프트볼, 축구, 하키, 라크로스를 나타냅니다.

그 위치에 1이 있으면 그 사람은 그 스포츠를 좋아합니다. 주어진 "binary"입력을 기반으로 사용자가 즐기는 모든 스포츠를 화면에 출력합니다. 주어진 이진수에 대해 사용자는 축구, 수영, 축구 및 하키를 좋아합니다.

  • 은 문자의 배열을하지 마십시오.

  • 열거 형 데이터 형식을 사용해야합니다.

나는 그것을인지 말해 문자열의 각 위치를 비교하는 방법을 모르겠어요 1 또는 내가 가진 하나의 아이디어가 나는 각 스포츠를 설정 곳 열거 타입을 사용하는 것입니다 0 에만 해당 위치가 1

enum sport{ 
    Football = 0010000000, 
    Baseball = 0001000000, 
    Volleyball = 0000100000, 
    ... , 
    Lacrosse = 0000000001 
}; 

난 후 원래 값은 지정된 위치를 떠나 오른쪽 주어진 값 "입력"배의 적절한 양/왼쪽 시프트 것 모두 설정하는 십 개 자리 숫자 다른 값은 0입니다. 축구 :

input << 2; input >> 9; input << 7; 

그래서 새 설정 값은 0010000000이됩니다. 그러면 전체 숫자를 비교할 수 있습니다. 나는 각 경우에 대해 그렇게해야 할 것이지만 나는 그것을하는 다른 방법을 생각할 수 없다.

내가 완전히 꺼져 있습니까? 비트 연산을 사용하여 각 위치의 값을 확인하는 더 기능적인 방법이 있습니까? 사전에 도움을 주셔서 감사합니다.

+0

1 비트 검사에 더 적합한 비트 시프트 이외의 연산자가 있습니다. – chris

답변

0

사용 비트 AND 연산자 & :

if (input & Football) { 
    // Football bit is set 
} else { 
    // Football bit is not set 
} 

는 또한 0b 접두사가 컴파일러 확장입니다하지만 C. 표준되지 않습니다 그리고 당신의 enum 값에 숫자가 0 접두어로 시작하는 점에 유의 8 진수 형식으로되어 있습니다 (이 문제를 해결해야합니다). 비트 조작에 16 진수 형식을 사용하는 것이 좋습니다.

+0

그래서 AND 연산자를 사용하면 입력 값의 이동 및 조작을 우회 할 수 있습니까? 0b 접두어에 대한 의미에 대한 정보를 좀 더 주시겠습니까? 우리의 강사가 우리에게 준 값 "input"이 사용되어야합니다. 다른 접두사로 열거 형 값을 시작하겠습니까? –

+0

AND 연산자는 처음에 내가 사용할 줄 알았던 모든 이동보다 훨씬 간단하게 구현할 수있었습니다. 모든 열거 형에 접두사 "0b"를 추가하기로 결정하고 프로그램이 올바르게 작동합니다. 도움을 주셔서 감사합니다. –

0

적절한 숫자만큼 왼쪽으로 1을 이동하여 스포츠 값을 정의하면 상황을 조금 더 쉽게 읽을 수 있습니다. 실제로, 스포츠 가치에 간단한 열거를 사용할 수 있으며이를 사용하여 비트를 이동시킬 장소의 수를 지정할 수 있습니다.

+0

그런 다음 그 시프트 된 값을 0010000000과 같은 상수와 비교할 것입니까? 각 스포츠의 왼쪽으로 이동 한 양은 열거 형 값인 Football = 0, Baseball = 1, ... 미안하지만, 당신이 말하는 것을 이해하려고 노력하고 있습니다. –

+0

문제 없습니다. 그래서 우리가 여기에 있습니다. ' enum 값을 1을 이동하는 자리 수로 사용합니다 (1 << Lacross에서와 같이 Lacross는 0이됩니다). 원래 열거 형에있는 값을 만드는 방법으로 사용합니다. 그 값이 어디에서 왔는지 쉽게 알 수 있습니다. –