Преобразование строки ASCII в целое число с использованием побитовых операторов в C и наоборот - PullRequest
0 голосов
/ 23 августа 2011

Я могу сделать это без использования побитовых операторов, как показано ниже

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

  return n;
}

Как можно добиться того же с помощью побитовых операторов в C без использования цикла for?

Ответы [ 3 ]

1 голос
/ 23 августа 2011

Вы можете добиться того же без цикла for, используя рекурсию:

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

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

Я не знаю, что с этим делать побитовых операторов, вы, конечно, не можете использовать только их без цикла ибез рекурсии для строк произвольной длины (для строк фиксированной длины вместо этого результатом, вероятно, будет что-то вроде развертывания цикла).

... но теперь, когда я читаю комментарии, яЯ уверен, что не понял смысла вопроса ... :S

0 голосов
/ 23 августа 2011

Одна из основных причин существования циклов заключается в том, что вы можете выполнять операции неизвестное количество раз.Если вы не знаете, какова длина вашей строки, у вас нет способа сделать это без цикла.Даже если вы знаете длину строки, почему вы хотите сделать это без цикла?

0 голосов
/ 23 августа 2011

За исключением упражнений по построению операций более высокого уровня из побитовых операций, задача, которую вы пытаетесь выполнить, глупа.Не делайте этого.

В качестве упражнения самое важное, что нужно понять, это то, что вам не нужно возвращаться к началу каждый раз, когда вам нужно реализовать что-то новое с точки зрения строительных блоков.Вместо этого вы можете написать функции сложения и вычитания в терминах побитовых строительных блоков и соединить их, используя уже существующий алгоритм более высокого уровня.

Что касается устранения цикла, вы можете просто развернуть его вподдерживать фиксированное максимальное количество цифр (например, самое длинное значение, которое может поместиться в int), если только вам не нужно поддерживать произвольное число начальных нулей.В целом, рекурсия - очень плохой подход, противоречащий всему аспекту этого упражнения, близкому к металлическому.Возможно, они просто хотят, чтобы вы не добавляли / увеличивали счетчик в цикле с добавлением «высокого уровня», и в этом случае вы можете использовать функцию побитового сумматора ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...