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

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    int iseven(long long int number)
    {
    	struct Num {
    		unsigned int x:1;
    		unsigned int y:31;
    		unsigned int z:32;
    	} num = (*(struct Num*)(&number));
    	return num.x; //Если результат 1, то нечётное.
    }

    Функция определения чётности числа посредством возврата младшего бита.

    Запостил: TurboLyudoed, 11 Октября 2024

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

    • Если в long long int не 64 бита, сломается. Надо было int64_t...

      И вообще что стандарт говорит о порядке битовых полей?
      Ответить
      • > Если в long long int не 64 бита, сломается.
        Да.

        >И вообще что стандарт говорит о порядке битовых полей?
        Зависит от компилятора и свойств системы. В конкретно этом случае по умолчанию используется порядок от младшего к старшему.

        Так что этот код попросту непереносим.
        Ответить
        • Мне кажется, компилятор имеет право выровнять структру Num как угодно, не говоря уж о байт-ордере и о том, что размер лонга не регламентирован

          Это какой-то хак уровня borland c под дос

          Кстати, четность числа можно проверить энднув его с единицей. Если последний бит единица, то число нечетное, не? А еще есть % 2
          Ответить
          • Кстати, у 6502, 6510, 8080 не было ни умножения, ни деления, ни взятия остатка. Представляешь, какой тяжёлый рантайм для ЯП у них?

            Самое смешное, что у древнего PDP-11 умножение и деление есть.
            Ответить
            • Мы учили асемблер, незнавший команд умножения (С)


              Как сказал бы j2376234: всегда же можно намакроёбить. Ну правда, умножение можно заменить сложением и проверкой
              Ответить
        • Код просто невыносим.
          Ответить

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