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

    +139

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    for ( i = 0; i <= n; i++ )
    {
    
        k = 0;
    
        for ( j = ( 2 * n - i - 1 ); k == 0; k++ )
        {
            a1 = a1 & ~ ( 1 << ( j ) );
            a1 = a1 | ( ( ( a1 >> ( i ) ) & 1 ) << ( j ) );
        };
    }

    по условию задачи (реверсирование битов числа) студентам нельзя было юзать if.

    Запостил: bieber, 10 Ноября 2011

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

    • школоло, но все равно смешно.

      минуты две понадобилось что бы 6ю строчку мозги приняли и проинтерпретировали.

      :)
      Ответить
      • 1. +1. зачем вообще внутренний цикл?
        2. реверсирует? n чему равна? если n = половине разрядности числа - тогда младшая половина не меняется, а старшая - реверс младшей. если n = разрядности числа вообще фигня получается...
        3. в строке 1: i <= n - косяк наверно.
        видимо требовалось что-то типа
        // n = sizeof(a1)*4;
        for(i = 0; i < n; i++){
        j = (2 * n - i - 1);
        t = ((a1 >> i) & 1) ^ ((a1 >> j) & 1);
        a1 ^= (t << i) | (t << j);
        }
        Ответить
        • а нет ли способа попроще?
          Ответить
          • Я так понял, надо 10010 превратить в 01001
            Ответить
          • конечно есть
            T result = 0;
            const size_t bit_count = sizeof(T)*CHAR_BIT;
            for (size_t offs = 0; offs < bit_count; ++offs) 
                result |= static_cast<T>((a >> offs) & 1) << (bit_count - offs - 1);
            return result;

            к Си упростить не велика проблема
            Ответить
          • Ахтунг! Платформозависимо, зато кошегно.
            i ^= -1;
            Ответить
            • *лицонапальме*
              Не инвертировать биты i=~i, а инвертировать порядок бит
              Ответить
    • У меня от лишних пробелов рябит в глазах.
      Ответить
    • #include <iostream>
      #include <limits.h>
      #include <assert.h>
      using namespace std;
       
      int main() {
              auto i=100500;
              numeric_limits<decltype(i)> info;
              assert(info.is_integer());
              int n=info.digits()+info.is_signed();
              decltype(i) r=0;
              for(int c=0;c<n;++c)
              {
                      r|=(i&1)<<(n-1);
                      r>>=1;
                      i>>=1;
              };
              cout<<r;
              return 0;
      }

      Не проверял, но можно что-то типа такого.
      Ответить
    • кстати, любой if можно записать как for(; <условие>; ){ <выражение> break;}
      жульничество конечно:)
      Ответить
      • А зачем здесь нужен if? Ума не приложу, куда его впихнуть. Только если цикл for переписать на for(;;) и применять if как условие выхода.
        Ответить
        • наверно подразумевается if (a1 & (1<<i)) r |= 1 << (n-i-1);]
          или что-то подобное
          Ответить

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