1. Pascal / Говнокод #12185

    +67

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    function IntToHex(N: integer): string;
    const
      S = '0123456789ABCDEF';
    var
      i: integer;
    begin
      SetLength(Result, 8);
      for i := 0 to 7 do Result[8 - i] := S[N shr (i shl 2) and $0F + 1];
    end;

    Носки менял, ноги мыл, все равно воняет хаккирством.

    И оно почему-то в модуле WinAPI.pas у Тараса лежит о_О

    Запостил: PascalGovno, 23 Ноября 2012

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

    • Баян, вроде бы Тарас уже выкладывал этот код.
      Ответить
    • Всё нормально, это не хаккирство, это оптимизация :)
      Ответить
      • А вот ответьте мне, те 2 минусанувших, в чём я не прав?

        i shl 2 - это умножение на 4.
        and $0F - сохраняет последние 4 бита , остальные обнуляет.
        В результате в цикле мы двигаем окно в 4 бита, которое используем как индекс в строке. Хотя я бы таки использовал массив [0..15], чтобы не делать "+1". И, возможно, не стоит заботится о сохранности значения N, и делать ему каждый раз shr 4, но это уже надо смотреть асмовый код :)
        Ответить
        • i shl 2 не понадобится, если сделать цикл с инкрементом 4, но тогда придётся использовать конкатенацию.

          А так, да, никакого хаккирства нет.
          Ответить
          • +4 - не получится, потому что i используется ещё как индекс для доступа к строке: Result[8 - i]
            А конкатенация - явно не быстрее, чем битовый сдвиг.
            Ответить
    • Воняет вот это:
      {$G+}
      function IntToHex(N: longint): string; assembler;
      asm
        push es
        push ds
        les di, @Result
        lea si, N
        add si, 3
        push ss
        pop ds
        mov cx, 8
        mov ax, cx
        cld
        stosb
      @@1:
        std
        lodsb
        cld
        push ax
        shr ax, 4
        cmp al, 9
        jb  @@2
        add al, 7
      @@2:
        add al, '0'
        stosb
        pop ax
        and al, $0F
        cmp al, 9
        jb  @@3
        add al, 7
      @@3:
        add al, '0'
        stosb
        loop @@1
        pop ds
        pop es
      end;
      Ответить
      • А вот это настоящее хаккирство. Ассемблер всё-таки.
        Ответить
      • Там где-то рядом должно быть {$IFDEF PUREPASCAL} и нормальная реализация.
        Ответить
    • Hex связано с битовым представлением, поэтому внутри - битовые операции.
      Ответить
      • Можно и без битовых операций. Заполнить сначала массив шестнадцатеричных представлений всех 256 возможных значений байта (можно даже отдельным скриптом и захардкодить в программу). А потом каждый байт исходного числа отобразить на этот массив.
        Ответить
        • А можно и без цикла. Заполнить массив шестнадцатеричных представлений всех 2^32 интов, всего 32 гига выйдет. А затем тупо выбрать из него нужные 8 символов.
          Ответить
          • А потом оказалось, что нужно перевести 64-битное число. Или, не дай Ктулху, 80-битное...
            Ответить
            • Алгоритм отлично масштабируется. А то, что не хватит памяти - так это проблемы с железом, а не с софтом.
              Ответить
        • оно =) http://govnokod.ru/10930 ?
          Ответить
          • во блин... вспомнил пароль =) это я, гость, который выше
            Ответить
    • Погонял тесты и обнаружил, что 1) у идеоне не работает ассерт (бля!) 2) этот говнокод надо топить 3) у Тараса немного быстрее библиотечной функции, но субоптимально.
      Ответить
      • > у Тараса немного быстрее библиотечной функции, но субоптимально.

        Ты знаешь значение этого слова?
        Ответить
        • Это риторический вопрос?
          Ответить
        • Внезапно!
          Клон Crimsonland
          Chr-редактор

          У меня совершенно странный вопрос. Клон Crimsonland в млаженчестве случайно не "Dekanat" (или вроде) назывался, и не из лабы ли вырос?
          Ответить
          • Нет, а что, слова на экране знакомые? Так это случайно совпало.
            Ответить
            • Скриншоты знакомые, особенно редактор символов.
              Ответить
              • Да, откуда? Может кто-то у себя его размещал?
                Ответить
                • Нет, Chr-редактор я видел у, хм, "одноуниверситетника" с исходниками, а "The Dekanat" писался у меня на глазах этим же человеком
                  Ответить
                  • Может таки то была другая программа? Или он их скачал, чтобы отчитаться перед преподом?
                    Ответить
                    • Вообще, я предполагал, что ты - это он. У меня с ним связи нет, потому и спросил.Про редактор не скажу, я его только мельком видел, но что-то похожее. А вот игрушку он именно писал.
                      Ответить
                      • Как его зовут? Где ты учился?
                        Ответить
                        • Ждем деанона тараса валерьевича березняка
                          Ответить
                          • guest такой guest сегодня...
                            Ответить
                            • имею основания полагать, что это не guest, а известный пидарок опять выходит на связь
                              http://govnokod.ru/11225#comment142886
                              Ответить
                          • Да, кто первым определит моё имя? Капитан Очевидность или Капитан Тавтология?

                            Ставлю на Капитана Очевидность, потому что Капитан Тавтология ошибётся, подумав, что моё имя "ТарасБ".
                            Ответить
                        • Не хочу обсуждать такие вещи в паблике.
                          Напишу на tarasber собако mail.ru
                          А в качестве валидации, что это я - прикло какой-нибудь набор букв в ответ, я ту т их выложу
                          Ответить
                          • пошел писать тарасу
                            набор букв следующий: ко
                            Ответить
                        • и тш7о 45762и8 4586т 58эт457ит32-5м13 41-то7-5и345тм24м3-8 --97924м5г295м195рлп29и-43лмз93м

                          Валидация пройдена? )
                          Ответить
      • > у Тараса немного быстрее библиотечной функции
        Бенчмарки на ideone это круто.
        Ответить
        • Да я вообще удивлён, что столько лет держу сайт, на нём куча моих старых игр (ещё когда я не знал, что делать некоторые вещи - некошерно), с исходниками, и только сейчас наконец-то из него что-то начало поститься сюда.
          Ответить
        • Не я первый придумал, тут уже их постили
          Ответить
    • кто-то гумно с этого акка минусует
      Ответить

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