Няшная / Говнокод #19559 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
for(x = 0; x < 27; ++ x) {
        flag = 1 << x;
        hold = 1 << i;
        if(x == z && x < 26) {
            if(!(bits & flag))
                bits = (bits & ~(-1 << i)) | ((bits & (-1 << i)) << 1);
            bits ^= bits & flag ? bits & hold ? flag | hold : hold : flag;
            if(!(bits & flag))
                bits = (bits & ~(-1 << i)) | ((bits & (-2 << i)) >> 1);
            hold = 1 << i;
        } else
        if(x == z)
            bits ^= flag;
        tag = szTag[x * 3 + (bits & flag ? bits & hold ? 2 :  1 : 0)];
        ListView_SetItemText(hWnd, row, x + 1, TEXT(PTCHAR(&tag)));
        if(flag & bits)
            ++ i;
    }

"Иногда вымогает, что в операциях сдвига биты втиснуть легко лишь с начала или с конца. А вот всерёдку:"
http://wasm.ru/forum/viewtopic.php?pid=578804#p578804

Запостил: SadKo SadKo, (Updated )

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

  • var m = (1 << position) - 1;
    var output = ((mask & ~m) << 1) | (mask & m);
    return value ? output | (m + 1) : output;


    так же как то?
    Ответить
    • m+1 в конце странно смотрится. А так вроде должно работать. Осталось призвать Борманда с решением вдвое короче.
      Ответить
      • Можно избавиться от тернарника другим сдвигом: return output | (value << position).
        Ещё, как мне кажется, можно придумать что-то с вращением числа, но у меня не придумывается 🙁
        Ответить
        • Без масок, походу, никак. Половину регистра же не повернёшь ;(
          Ответить
          • Через & или через &&? && это тоже бранч, а & не поможет, если в value, например, двойка. Можно сделать !!value, если мы думаем, что там может быть не единица.
            Ответить
      • А че там упростишь? Левая половина, бит, правая половина... Ну вот только тернарник убрать, как ты и предложил.
        Ответить
        • Но сааааамое важное

          if ((position < 0)||(position > 31)) throw new Exception();
          var m = (1 << position) - 1;
          return ((mask & ~m) << 1) | ((value & 1) << position) | (mask & m);
          Ответить
            • То у метода другая сигнатура. Хотя можно и через рефлексию вытащить
              Ответить
                  • Тогда уж проще список из булов... Вставлять точно проще.
                    Ответить
                    • Это шарп, детка. Тут unsafed code может юзаться рядом с рефлексией и автора это нисколько не смущает.

                      А все потому что в шарпе биты ебутся не для производительности, а для души....
                      пысы - это ты мне ошибки указал в рассказе?need more!
                      Ответить
    • return mask & ~(1 << position) | ((value & 1) << position);
      или я что-то недопонял?
      Ответить
  • >Иногда вымогает, что в операциях сдвига биты втиснуть легко лишь с начала или с конца
    >>Иногда вымогает
    Вореций вернулся??
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8