2011-08-23 7 views
0

나는 비트 연산자를 아래처럼 사용하지 않고 이것을 할 수있다.C에서 비트 연산자를 사용하여 ASCII 문자열을 정수로 변환 (& B)

int AsciiToInteger() 
{ 
    char s[] = "Stack Overflow"; 
    int i, n = 0; 
    for (i = 0; s[i] !='\0'; i++) 
    { 
    n += s[i]; 
    } 

    return n; 
} 

for 루프를 사용하지 않고 어떻게 C에서 비트 연산자를 사용하여 동일한 결과를 얻을 수 있습니까?

+2

이것은 (분명히) 표준'atoi' 함수가 아니기 때문에 다른 이름을 사용하고 달성하고자하는 것을 설명하는 것이 좋습니다. 코드에서 비트 연산자를 사용하는 것을 보지 못합니다. 요점 일 수도 있고 아닐 수도 있습니다. 특히 그 부분이 전혀 이해되지 않았습니다. 특히 atoi가 없으면 코드없이 작동 할 것으로 기대합니다. 구현 - 그리고 루프가없는 임의의 길이의 문자열로 무엇을 할 수 있기를 기대하는 이유는 무엇입니까? –

+0

@ Christopher, 당신 말이 맞아요. 이것은 표준 기능과는 아무런 관련이 없습니다. 비트와 & 루프를 사용하지 않고이 작업을 수행 할 수 있는지 궁금합니다. – Kelly

+1

누구가이 질문을지지했다? 현재 전혀 이해가되지 않습니다. –

답변

1

당신은 for 루프를 사용하여 재귀없이 동일하게 얻을 수 있습니다

int AsciiToInteger(const char * Str) 
{ 
    if(*Str) 
     return (int)*Str + AsciiToInteger(Str+1); 
    else 
     return 0; 
} 

/* ... */ 
int n = AsciiToInteger("Stack Overflow"); 

나는 비트 연산자는 이것으로 무엇을해야 모르는, 당신은 분명히 루프없이 재귀 없이 만 사용할 수 없습니다 임의의 길이의 문자열 (고정 된 길이의 문자열 대신 결과는 아마도 루프를 풀는 것과 비슷할 것입니다).

...하지만 지금은 내가이 질문의 의미를하지 않았다 꽤 확신 코멘트를 읽어 ... 비트 연산에서 높은 수준의 작업을 구축 운동 등을 제외하고

+0

이제'atoi'가 오버플로에 대해 지정되지 않은 값보다는 * 정의되지 않은 동작 *을 갖는 이유를 알았습니다 ...> _ < –

0

:S, 성취하려는 일은 어리 석다. 하지 마.

실습에서 가장 중요한 점은 빌딩 블록 측면에서 새로운 것을 구현해야 할 때마다 처음으로 돌아갈 필요가 없다는 것입니다. 대신에 비트 단위 빌딩 블록의 측면에서 더하기 및 빼기 함수를 작성할 수 있으며 이미 가지고있는 기존의 고급 알고리즘을 사용하여 이들을 결합 할 수 있습니다.

루프를 제거하는 경우 임의의 수의 선행 0을 지원해야하는 경우가 아니면 고정 된 최대 자릿수 (예 : int에 해당하는 가장 긴 값)를 지원하도록 루프를 풀면됩니다. 재귀는 일반적으로 매우 나쁜 접근이며이 연습의 전체 "금속에 가까운"측면과 반대입니다. 아마도 그들은 단지 당신이 당신의 비트 가산기 함수를 사용할 수있는 "고수준"덧셈과 함께 루프의 카운터를 추가/증가시키는 것을 피하기를 원합니다. ...

0

루프가 존재하는 주된 이유 중 하나는 알 수없는 횟수만큼 작업을 수행 할 수 있습니다. 문자열의 길이를 모를 경우 루프없이이 작업을 수행 할 방법이 없습니다. 문자열의 길이를 알더라도 루프가 없으면 왜 그렇게할까요?

관련 문제