1. Си / Говнокод #17544

    +133

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    #include <stdio.h>
    int main () {
    char c;
    int result=0;
    while(scanf("%c",&c) ) {
    if( (c<'0') || (c > '1') ) break;
    result«=1;
    result+=c-'0';
    };
    printf("%d",result);
    return 0;
    }

    Этот код переводит число из двоичной системы в десятичную. Зачем-то основано на работе с символами.

    Запостил: alexmir, 29 Января 2015

    Комментарии (38) RSS

    • result«=1
      Ути-пути.
      Ответить
      • Кстати, некоторые подобное используют: http://сами-знаете-где/post/243005/
        Ответить
        • Ага, там правда правильно пишут, что то что подходит для одного языка будет мерзко смотреться в другом. В связи с чем предлагаю ввести в Юникод специальные коды-модификаторы котоые переключают язык.

          Оказывается, там уже есть Language tags. Осталось добавить поддержку языков программирования.
          Ответить
          • Чего там только нет... Жаль, из этого порой выходит слишком сложная система, хитрые уязвимости и нечеловеческие требования к простому пользователя простого текста.
            Ответить
      • как это читается? побайтово присвоить единицы что-ли?
        Ответить
        • Посимвольно видимо. Если честно, то сам не понимаю.
          Ответить
        • "Сдвинуть все биты числа на одну позицию влево"
          P.S. Это в том случае, если б оно компилировалось.
          Ответить
          • >>как это читается?
            >"Сдвинуть все биты числа на одну позицию влево"
            Не обманывайте.
            "резалт открывающая кавычка равно один"
            Ответить
            • О, Вы C++ Знаете? Может, поясните тогда, зачем оно основано на символах, что значит "result+=c-'0'" и что делает break?
              Ответить
              • Тсс! Пророк Мертвый Страус запрещает задавать такие вопросы всуе
                Ответить
                • Это не плюсы,долбоёб.
                  Ответить
                  • О, Вы C++ Знаете? Может, поясните тогда, зачем оно основано на символах, что значит "result+=c-'0'" и что делает break?
                    Ответить
                    • Ну брейк выводит из цикла, если встретилась не 1 или 0 (это по условию задачи жи). result += c - '0' увеличивает результат на с - '0' что даст нам int. Со сдвигами я лох, потому не осознаю до конца работу кода, но примерно так.
                      Ответить
                      • > Со сдвигами я лох

                        result <<= 1 сдвигает result на один бит влево. Битовое представление аналогично представлению в двоичной системе, поэтому result = result << 1 аналогично умножению на "10" в двоичной системе, т.е. result <<= 1 аналогично result *= 2.

                        Всё это аналогично result = result * 2 + (c-'0'); - "дописываем" новую цифру в конец числа. Или же, если использовать сдвиги и побитовое или: result = result << 1 | c - '0'; Из-за того, что в (result << 1) младший бит нулевой (сдвинули содержимое влево - самый правый бит "пустой"), а (c - '0') может быть строго либо 0, либо 1, можно "+" заменить на "|".
                        Ответить
            • std::string s(«кавычки»);
              Ответить
      • Ворд спалился
        Ответить
        • Почему? Может, это уголок Дурова или Денискина.
          Ответить
    • ничего не понимаю, боже, где отступы?
      Ответить
    • main должен принимать void
      Ответить

    Добавить комментарий