2015-01-15 2 views
0

나는 (아주) 짧은 코드를 리비전으로 C에 작성하려하고있다.C에서 비트 검사 - 오답인가요?

내 교육 및 기타 게시물에 따라;

How do you set, clear, and toggle a single bit?

다음 코드는 변수 준비에 "1"값을 배치해야합니다, 그럼에도 불구하고,이 값 (64) 다른 모든 제품은 테스트 비트의 단지 값이 배치되는 것을 나타냅니다 배치하지 단순히 두 숫자 (숫자와 (1 < < x))의 결과와 함께 - 실제로 64 일 것입니다! 이 경우입니까 아니면 단순히 잘못된 단계를 취하고 있습니까?

uart->status |= (1<<6); //Set bit 6 to 1 

char input = 0; 

int ready = (uart->status) & (1<<6); //Should mean ready = 1?, a 

    if(uart->status & (1<<6) == 1) { //ready actually = 64 
     input = uart->rx; 
    } else { 
     input = 0; 
    } 

대단히 감사합니다.

다윗

+1

'&'(비트 AND (), 비트를 지울 것입니다.비트를 설정하려면'|'(비트 OR)을 사용하십시오 –

+0

변수의 6 번째 비트 인 uart-> status를 확인하고 싶습니다. 만약 a가 1이라면 1 & 1은 1을 줄 것이고, 0이면 1 & 0은 0을 결과로 취할 것입니다. – davidhood2

+1

'64 & 64'의 결과는'64'입니다. 왜 그것이'1' (?)이 될지 확신하지 못합니다. – Michael

답변

4

& 연산자는 비트 단위 AND 즉 동작을 수행한다. 각 비트에 대해 독립적으로 작동하고 결과 비트를 해당 위치에 반환합니다. 따라서 비트 6이 인수가 모두 1 인 유일한 위치 인 경우 자연스럽게 64를 반환합니다.

&&의 동작과 혼동을 줄 수 있습니다 (입력 및 출력을 효과적으로 부울로 강제 변환 함). 따라서 1 또는 0을 반환합니다).

그래서 코드의 문제는 값 1에 대해 비교하는 user3159253가 지적한대로 대신

if(uart->status & (1<<6) != 0) 

말할 수 순전히이다. 또는 당신은 AND 연산 값을 얻을도, 물론, 단지 당신은 비트 단위 AND이 작업을 적용하고

if(uart->status & (1<<6)) 
+0

나는'&':'if ((v & (1 << 6)! = 0) '또는 간단히'if (v & (1 << 6))'후에 0과 비교하는 것이 안전하다고 덧붙일 것이다. – user3159253

2

: 그래서,

int ready = (uart->status) & (1<<6); // 0x00000040 & 0x00000040 = 0x00000040 

당신이 원하는 것은 무엇을? 비트가 설정되어 있는지 확인할 수있는 플래그를 원하십니까?

if (ready) 
{ 
    // code here 
} 

을 그리고 ready 제로가 아닌 이후이 작동합니다 : 그래서, 당신은 확인해서, 당신은 할 수 있습니다. 당신이 비트 (6)가 설정되어있는 경우 테스트 할 때

+0

- 내가 물어 보는 이유는 이전의 게시물 (그리고 실제로 내가 배웠던 !!!) 명령은'test = number & (1 << x); '명령은 1 비트 길이의 비트 AND 연산을 수행 할 뿐이며 "비트 x의 값을 변수 테스트에 두십시오." – davidhood2

+1

그 종류가 이상하게 묘사되었을 것입니다.'(1 << x)는 "비트 'x'로 값을 설정하는 것입니다. to 1 "이됩니다. 그래서'(1 << 4)'의 경우'0x00000010'으로 컴파일됩니다. 그래서'test = number & 0x00000010'라고 쓰면 그 연산 결과 인 비트와 앤드 값을 얻을 수 있습니다 .. –

1

라인

if(uart->status & (1<<6) == 1) 

if(uart->status & (1<<6) > 0) 

해야한다.

** 수정 **

이미 '준비'변수가 있기 때문에이가 정상 작동하고

if(ready) 
+2

그것은'uart-> status'가 선언 된 방법에 따라 비트 7 일 경우 작동하지 않을 수도 있습니다. –

+0

그래서 '비트 6이 설정되어 있는지 테스트하고 싶을 때'라고 말한 것입니다.하지만 어쩌면 내가 무슨 뜻인지 이해하지 못할 수도 있습니다. @ 웨스터 버지니아 네. –

+1

포트가'char'로 선언되었고, 비트 7이 관심 대상 이었기 때문에, 양수 테스트가 작동하지 않기 때문에. 좋은 연습 문제입니다. 0이 아닌 경우를 테스트합니다. 사실 필요한 것은'if (uart-> status & (1 << 6)) {}'입니다. –

0

할 더 좋을 것이다. 비트가 설정되면 값은 0보다 커집니다. 비트가 지워지면 값은 0이됩니다. 정확히 1인지 테스트하지 마십시오.

+1

0이 아닌지 여부를 테스트하고 표지로 싸서는 안됩니다. –