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

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    int Xor4Bit_2 (unsigned char data)
    {
         unsigned char result = data;
          while (data != 0)
         {
             result ^= data & 1;
             data >>= 1;
         }
          result &= 1;
         return result;
    }
    
    вот как студенты получают xor битов числа
    это же нужно так извратить простой рабочий алгоритм
         
    int Xor4Bit_2 (unsigned char data)
    {
         int result = 0       
         while (data != 0)
         {
             result ^= data & 1;
             data >>= 1;
         }
         return result;
    }

    получил данный код после измышлизмов знакомого студента, перед этим дав ему рабочий вариант, мдя...

    Запостил: ageron, 04 Июля 2010

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

    • так а какой вариант (ты думаешь) есть говно?

      по мне так оба гавно. итерацию по битам можно сделать лучше. а для uint8_t можно и вообще без циклов.

      http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/
      Ответить
      • Неплохо...
        data = data - ((data >> 1) & 0333) - ((data >> 2) & 0111);
        data = (((data + (data >> 3)) & 0307) % 63) & 1;
        return data;
        Ответить
        • % 63
          Это что?
          Ответить
          • Ставка по ипотеке в России.
            А вообще - остаток от деления.
            Ответить
            • Я в курсе. Я про логическую нагрузку в данном контексте.
              Ответить
          • >% 63
            >Это что?
            Не подъёмный матан для любителей писать прозрачные легко поддерживаемые обновляемые почти безошибочные программы.
            Ответить
            • //оффтоп
              кстати по поводу матана: предлагаю разрешить анонимусам постить камменты при том, если оный прошёл матанокапчу, будет фильтровать от школоты всякой, хотя есть вероятность использования калькулятора, но до этого тяжко будет додуматся. Темболее если какое уравнение.
              Ответить
              • Я за систему векторных уравнений с интегралами и частными производными. При этом, пускай это нужно решать перед каждым постингом коммента гостю.
                После такого гости начнут постить исключительно самые полезные комменты. Редким мазохистам захочется это решить ради какого-нибудь вебкиловского говнокомента.
                Ответить
                • и ввести это в систему регистрации. Баттхёрт у сами знаете кого обеспечен ^_^
                  Ответить
                • Я так и вижу PHP разработчика или например JS разработчика с легкостью решающего векторные уравнения с интегралами
                  Ответить
                  • КАК НА JQUERY ПОСЧИТАТЬ ЭТОТ ПРИДЕЛ???7

                    приаттачен файл Безымянный.bmp
                    Ответить
              • Мяк!
                А как быть с теми старперами, кто матан забыл еще тогда, когда ЦА капчи еще на свет не появились?:)
                Ответить
                • Чего? Да старпёры ещё Вас по матану обойдут на пару порядков. :)
                  Ответить
                  • Да меня-то ладно, у меня по нему трояк был даже когда я его изучал:)
                    Ответить
          • > % 63 Это что?
            Остаток от деления на 077. Тут единичные биты суммируются по 3 в группе, потом берётся их общая сумма и проверяется на нечётность. Если сумма нечётная, то результат 1, иначе 0. Как-то так.
            Аналогия в десятичной системе счисления:
            203040607 % 99 == 22
            (сумма цифр в 203040607)
            Ответить
            • конечно извиняюсь, то ли я не так понял пост, то ли в посте ошибка 203040607 % 99 = 07
              имелось ввиду взятие остатка от 99 в цикле и суммирование резалтов, поскольку во втором посте делается именно это не без цикла - 07+06+04+03+2 - верно?
              Ответить
            • Точно. Я тоже сначала непонял. Теперь всё ясно, как божий день.
              Ответить
      • >>>по мне так оба гавно
        +1, в обоих случаях брутальный говноподход - в лоб
        отличный линк кстати вот это n &= (n - 1) ; // вообще гениально

        повторю свою уже стающую коронной фразу: на асме это делается в одну строку ))
        popcnt eax

        кстати по линку как использовать эту инструкцию в gnu
        GNU compiler allows for
        int __builtin_popcount (unsigned int x)

        без асма (то есть если у меня было че-нить подревней Core 2) я бы сделал наверно таблицей, как в случае 3 Precompute.
        Ответить
        • ну или заюзал бы bsr (в случае x86) или cntlz в случае PowerPC
          Ответить
          • Ну это только если не нужно писать кросплатформенный код. Мне тоже ленно писать длиннющий цикл, если можно написать за строку. Действительно не во всех проектах нужна переносимость. Хотя, если над каким-то проектом планируется дороботка другим программистом, то это плохой тон.
            Ответить
      • Dummy, в студ поделках за производительностью не гоняться да и я пишу не протоколы работы с устройствами или алгоритмы шифрования/хеширования (хотя было и такое). но я точно знаю что вот это рабочее:
        int Xor4Bit_2 (unsigned char data)
        {
        int result = 0
        while (data != 0)
        {
        result ^= data & 1;
        data >>= 1;
        }
        return result;
        }

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

          кстати этот алгоритм тоже интуитивно просто и понятен
          int bitcount (unsigned int n) {
          int count = 0 ;
          while (n) {
          count++ ;
          n &= (n - 1) ;
          }
          return count ;
          }
          а работает раза в 2 быстрее, так что оба - говно, а еще и студентов этому учите
          после сессии сюда студенты ложили свои высеры, а теперь и преподы подключились )))
          Ответить
          • Преподы тоже высирают? Помоему не такой уж ужас. Всё же квалифицированей, чем студенты, так что им есть чему поучится.
            Ответить
            • >>не такой уж ужас
              согласен, код в принципе неплох, тут и похлеще бывает
              и все же кал, поскольку можно написать лучше/короче/быстрее
              а студенты его договняют и постят в виде своих лаб ))
              Ответить
    • while (data > 1) {
        data ^= ((data & 1) << 1);
        data >>= 1;
      }
      return data;
      Ответить
    • ageron, а какой из этих вариантов ваш?
      Ответить
    • data^=(data >> 16)
      data^=(data >> 8)
      data^=(data >> 4)
      data^=(data >> 2)
      data^=(data >> 1)
      return data & 1
      Ответить
      • Любите разворачивать циклы при каждом удобном и неудобном случае?
        Лучше уж что-то типа:
        for(int i=1;i<=16;i<<=1)
        	data^=(data >> i);
        return data & 1;
        Если компилятор сам не развернёт цикл, то можно будет развернуть его через шаблоны С++.
        Ответить
        • Только ради всего святого, не в Си-разделе:)
          Ответить
        • Разворачивать циклы конечно плохо, но, имхо, в данном случае читаемее получается и быстрее.

          Мне, кстати, кто-то обещался провести тесты, доказывающие, что цикл быстрее развёртки, но так и не провёл.
          Ответить
          • >Мне кто-то обещался провести тесты
            Это не Я. :)
            Ответить
            • Да вас, говногостей, хрен разберёшь.
              Ответить
              • Я единственный и неповторимый.

                А разбирать меня не нужно. Я для этого не предназначен. Меня недавно только собирали.
                Ответить

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