2016-07-12 2 views
-3

비트 연산에 새로운 것이므로 제 질문에 불만을 갖거나 stackoverflow에 적합하지 않은 경우 사전에 사과드립니다. 최근에 나는 바이너리 사이의 & 심볼을 사용하여 표현식의 결과를 출력하기 만하면 bitwise AND 연산을 수행하고 있습니다. 일부 표현식에서는 바이너리와 소수 사이의 비트 AND를 사용합니다. 예를 들어, 나는 110 & 4 내가 C에 인쇄뿐만 아니라 비트 연산 계산기에 값을 입력 한 후이 결과를 얻을 110 & 100에와비트 연산이 부정확 한 결과를 나타냅니다.

1 1 0 
1 0 0 
------- 
1 0 0 

동일시하기 때문에 110 & 44 동일 것을 알고있다. 그러나 나는 경우 0 밖으로 main 인쇄의 첫 번째 줄 내 이해 01010가 (동일한 바이너리 저를 수정하시기 바랍니다 때문에 왜

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    printf("%X\n", 010 & 2); //prints out 0?!?!? 
    printf("%X\n", 10 & 2); //prints out 2 
    printf("%X\n", 011 & 010); //prints out 8?!?!? 
    return 0; 
} 

잘 모르겠어요,이 같은 특정 방정식이 발생하면 혼란스러워 'm wrong)이고 010 & 010010과 같아야합니다. 이는 2과 같습니다. 마지막으로 마지막 출력이 완전히

0 1 1 
0 1 0 
------- 
0 1 0 

그러나, 실제 출력이 8

마지막으로, 나는이었다 인쇄하기를 기대했던 있기 때문에 경비 날을 던졌습니다, 어떻게 이러한 비트 연산에 대한 하나 개의 빠른 질문이 있습니다 부울로 바뀌십시오. 예를 들어, 나는 경우 코더의 조건으로 이러한 식을 사용하는 결과가 0이 아닌 같은

int byte; 
scanf("%d",&byte); 
if(byte & 2){ 
..... 
} 

로 문을 byte & 2 긴으로 true로 동일시 하는가 봤어요? 모든 조언을 부탁드립니다.

EDIT : 내가 지금 일하는 정수 상수 유형을 언급하는 것을 잊어 버린 이유는 무엇입니까? 제 의도는 8 진법이 아닌 2 진법을 사용하여이 혼란에 대해 사과드립니다.

EDIT2 : 콘솔에 0b010을 입력하면 위의 if 문이 작동하지 않는 것 같습니다. 그러나 0b010 & 2은 2와 같으므로 잠재적으로이 문제의 원인이 될 수 있습니까? C에서

int byte; 
scanf("%d",&byte); 
if(byte & 2){ 
    //doesn't work when I input 0b010 
} 
if(0b010 & 2){ 
    //statement gets executed here but not the above, why? 
} 
+0

'110' dec은'0b1101110'입니다. 그리고 정수 상수가 C로 어떻게 쓰여지는지 읽어보십시오. 그것은 중간에 수용 가능한 C 책으로 보여집니다. 표시기없이 숫자 체계를 혼합하지 마십시오. 질문이 명확하지 않습니다. – Olaf

+0

어떤 기지에서 일하려고합니까? 당신의 왼쪽 피연산자가 바이너리이고 오른쪽이 십진수 인 것처럼 보입니까? – amit

+0

C (및 다른 언어)에서 '0'으로 숫자를 시작할 때 이진수가 아닌 ** 옥타브 **를 의미합니다. – Barmar

답변

3

: 우리 '가하면서 8

  • 10가 10
  • 011 십진 9.
  • 위한 진수이다 및 위해

    • 010 진수 인 다시 ...

      • 100은 100에 대한 십진수입니다.

        • 일부 컴파일러/표준 바이너리 상수 0b010을 받아 : 이진하려면

        당신은 뭔가 다른 일을해야합니다.

      • 그렇지 않으면 당신은 두 번째 부분에 대한 답변은 그 비트 연산자 "는 논리 값으로 전환"하지 않는 것입니다

      , 8 진수 (0 시작) 진수로 변환 또는 16 진수 (0x을 시작) 할 필요가있다. C는 예를 들어 if 문에서 0 또는 Null 값을 false로 해석하고 0이 아닌 값은 true로 해석합니다. 부울이 아닌 컨텍스트에서는 숫자, 포인터 등이됩니다.

    +0

    대단히 감사합니다. 매우 도움이되었습니다. 나는 그러나 하나의 질문이 있습니다. 내 질문에 위의 코드의 마지막 스 니펫을 사용하는 이상한 이유로 0b010을 입력하면 if 문 조건이 true로 평가되지 않습니다. 그러나 0b010과 2의 값을 별도의 프로그램에서 출력했으며 그 값은 0보다 큽니다.이 이상한 결과를 초래할 수있는 것은 무엇입니까? –

    +0

    'scanf'는 아마도 2 진 상수를 지원하지 않습니다. 단지 '0' 다음에 숫자가 아니고 더 이상 읽지 않는 것을 보게됩니다. – ams

    +0

    누군가가 이전에 코멘트를 게시했는데, 이는 어떤 이유로 든 이제는 문자열로 입력 한 다음 작동하는'strol'으로 구문 분석하는 것에 대해 삭제되었습니다. –

    관련 문제