1. C# / Говнокод #16002

    +134

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    private byte Summ(byte a, byte b, byte p)
            {
    
                return Or(Or(Or(And(p, Not(a)), And(p, Not(b))), Or(And(b, Not(a)), And(b, Not(a))))Or(And(a, Not(b)),And(a, Not(p))), ()) ;//тут я и сломался 
             
            }

    Запостил: Shadowy1, 17 Мая 2014

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

    • Я правильно понимаю, что эти a, b, p - это не байты, а биты?
      // модель однобитового сумматора
      private Tuple<bool, bool> Summ(bool a, bool b, bool p)
      {
          return Tuple.Create(
              a && b || a && p || b && p, // перенос в следующий разряд
              a ^ b ^ p // результат
          );
      }
      Ответить
      • >Tuple<bool, bool>
        Жуткая переголова.
        Хотя я читал что например ghc может упаковать такой возврат в один регистр.

        > a, b, p - это не байты, а биты?
        p - точно флаг переноса. А так можно и по 32 бита складывать.рекурсивно
        Ответить
        • > Жуткая переголова.
          Если этот Summ заинлайнится в цикл из которого его будут вызывать, и компилятор додумается выкинуть Tuple, заменив его парой локальных переменных - переголовы не будет...

          P.S. Ну и кого волнует черезголова в проге, демонстрирующей принципы работы сумматора с последовательным переносом? :)
          Ответить
          • > и компилятор додумается выкинуть Tuple, заменив его парой локальных переменных - переголовы не будет...
            В сишарпе компилятор ничего не выкинет, это не кресты.
            Насчёт оптимизации и аллокации CLR на стеке точно не знаю, но и сильно в этом сомневаюсь.
            Кортеж - это объект, а не структура. Зачем тогда вообще struct и stackalloc в язык пилить?
            Ответить
            • Ты не поверишь, но джит прекрасно инлайнит методы (начиная с 2.0) и разворачивает классы в набор полей на стеке (это только с 4.0). В этом легко убедиться, выводя в релизе Environment.StackTrace в консоль.
              Ответить
              • >но джит прекрасно инлайнит методы (начиная с 2.0)
                Чего ж мне не верить? Я видел много чудес сотворённых джитом, например инлайн виртуальных методом.
                >разворачивает классы в набор полей на стеке (это только с 4.0).
                Тогда зачем тогда вообще struct и stackalloc в язык пилить?
                Ответить

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