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

    +135

    1. 1
    return ((((num & ~(0xFFFFFFFF << n)) >> (n - 0x1)) & 0x1) == 0x1) ? ((num & ~(0xFFFFFFFF << n)) ^ ~(0xFFFFFFFF << n)) + 0x1 : (num & ~(0xFFFFFFFF << n));

    Запостил: EON8ight, 01 Сентября 2013

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

    • смысл кода только в голове автора
      Ответить
      • условие тернарника проверяет равен ли энный бит 1.

        если я не ошибаюсь.

        а выход - что то страшное
        Ответить
        • В общем эта хрень обрезает число до указанной разрядности и возвращает модуль обрезка.

          Например num = 0xFFFFFFFE, n = 8 получаем обрезок 0xFE, его старший бит один, поэтому отрицнем, и получим 0x02.
          Ответить
          • меня больше интересует зачем и почему так)
            Ответить
            • Ждем ответа ОП'а о том, где этот код юзался ;)
              Ответить
              • Returns the absolute value of the first n bits of num, from a student's homework assignment. Easier way to read:

                int toReturn = num;
                int mask = ~(0xFFFFFFFF << n);
                toReturn &= mask;
                		
                int temp = toReturn >> (n - 0x1);
                		
                if(temp & 0x1 == 0x1)
                	toReturn = (toReturn ^ mask) + 0x1;
                		
                return toReturn;
                Ответить
                • Хм. Т.е. я ее правильно прочел...
                  Ответить
                • var minus = num>> 31;
                  return ((minus ^ num) - minus) & ((1 << n) - 1);

                  как то так?
                  Ответить
                  • > var minus = num>> 31;
                    Нет. Знак нужно брать не из старшего бита всего числа, а из старшего бита обрезка. num я так понимаю знаковый, чтобы в minus попали 0x00000000 или 0xFFFFFFFF?
                    Ответить
                    • то есть n ый символ показывает знак, а n-1 - число?
                      Ответить
                      • 0 .. n-2 - число
                        n-1 - знак.

                        Кстати, в шарпе как дела обстоят со сдвигами на число, больше либо равное разрядности (например 32-битного на 32 или 33)? Поведение определено в спеке?
                        Ответить
                        • i<<1 == i<<33
                          Ответить
                          • Тогда ((1 << n) - 1) не работает при n == 32. Впрочем код ОП'а тоже при 32 не работает.
                            Ответить
                            • ((0-((num>>(n-1))&1))^num)&((1 << (n - 1)) - 1)
                              Ответить
                              • > 0-
                                Шарп не умеет в унарный минус?

                                > (1 << (n - 1)) - 1
                                А теперь при n=0 не работает.

                                P.S. Где-то мы тут уже обсуждали эту проблему про функци, которая бы генерила маски от 0 до 32 бит. Но что-то запамятовал, нашлось ли красивое решение, и если да, то какое.
                                Ответить
                                • >Шарп не умеет в унарный минус?

                                  умеет, я гоню

                                  я же правильно думаю
                                  num = 10100
                                  n = 5
                                  out = 1011 = 11
                                  тогда при n = 1 или 0 он должен вылетать нафиг с ексепшеном)
                                  Ответить
                                  • ибо при 1 он указывает на начало, следовательно нет символов для интерпертации, а при 0 нет даже флага)
                                    Ответить
                                  • > тогда при n = 1 или 0 он должен вылетать нафиг с ексепшеном)
                                    Ага, 0 и 1 не имеют смысла, экцепшн тут вполне к месту.
                                    Ответить
                                    • тогда проще описать так и забить

                                      private static int Do(int num, int n)
                                              {
                                                  Contract.Requires<ShityException>(n > 1);
                                                  return ((-((num >> (n - 1)) & 1)) ^ num) & ((1 << (n - 1)) - 1);
                                              }
                                      Ответить
    • 0x1 - один в шестнадцатеричной же? тогда какой смысл?
      Ответить

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