2014-12-11 2 views
0
/* This program's aim is to count the number of bits set in an integer */ 

#include<stdio.h> 

int count=0; 
int check(int); 

int main() 
{ 
int i,r; 
char ch; 
printf("enter the integer for which you want to check the bits set"); 
scanf("%d", &i); 
r=check(i); 
printf("the number of occurance of 1 in the integer is %d \n", r); /*don't know why isit   printing 0 when i give 4 as input */ 
    return 0; 
} 


int check(int j) 
{ 

if((j & 1)==1) 
count++; 

for(int l=0;l<31;l++) 
{ 

    if(j>>1 & 1) 
    count++; 

} 
return count; 

} 

이 프로그램에 어떤 문제가 있습니까? 어리석은 실수 나 개념적인 것처럼 보입니다. 또한 j >> 1로 작성해야합니까? 우리는 단순히 j >>를 쓸 수 없습니까?왜이 비트 조작 프로그램이 잘못된 O/P를 제공합니까?

+1

정말 코드 서식을 개선해야합니다. – harold

+0

들여 쓰기를 수정하고 언어 태그 –

+0

을 추가하십시오. 다른 구현 : http://stackoverflow.com/q/109023 – harold

답변

0

j >> 1이 잘못되었으므로 왜 글을 쓸 필요가 있는지 물어 보면별로 의미가 없습니다.

j >>은 훨씬 덜 합리적입니다. j + 또는 j *을 쓰지 않습니까? 그렇다면 >>에 대해 왜 작동해야합니까?

어쨌든 l (소문자 L이 아닌 하나)으로 모든 비트를 테스트하거나 j을 변경할 수 있으므로 매 단계마다 1 씩 이동해야합니다. 두 번째 방법으로 코드를 수정하는 것이 상대적으로 최소한이지만, 글로벌 양식을 count으로 바꾸는 것은 정말 열악한 형식이기 때문에 로컬로 변경했습니다.

int check(int j) 
{ 
    int count = 0; 
    for (int l = 0; l < 32; l++) 
    { 
     if (j & 1) 
      count++; 
     j >>= 1; 
    } 
    return count; 
} 

여전히 문제가 있습니다.

int이 32 비트가 아니면 어떨까요? 32 비트는 어떨까요? (괜찮 으면 l < 32이라고 쓸 수 있으며 코드에 더 부합 할 수 있습니다. 실제로 의도 한 내용이 확실하지 않습니다.)

왜 서명이 시작 되나요?

그리고 check이 기능이 실제로 무엇을하는지에 대해 많은 말을하지 않습니다,이 기능의 이름을 수 popcnt 또는 hammingweight 또는 그런 numberOfSetBits이나 뭐. 그리고 개인적으로 나는 다른 알고리즘을 사용 하겠지만, 그것은 당신에게 달려 있습니다.

+0

나는 정수를 32 비트로 취합니다. chec 한 번 장소에 나는 첫 번째 수표를 사용했고 나머지 31 개 장소는 내가 루프를 사용했다. 다른 결함이 있습니까? – JIN007

+0

@ user3287223 유형을'uint32_t'로 변경하고 이름을 변경하면 OK입니다. 그런데 비트에 대해 배우고 이해하는 데 도움이 필요하면 원하는 경우 #omnimaga on efnet을 사용하십시오. (또는 stackoverflow에 대한 자세한 질문을하십시오.) – harold