Преимущество написания (1 << 24 - 1) вместо FFFFFF? - PullRequest
7 голосов
/ 25 мая 2011

У меня есть фрагмент кода на C со следующим:

a = b & ((1<<24) - 1);

Если я не ошибаюсь, это эквивалентно:

a = b & 0xFFFFFF;

Какая выгода с точки зрения производительности, чтобы написать первый? Для меня это сложнее читать, но я полагаю, у парня, который написал это, был лучший C-фон, чем у меня.

Спасибо

Ответы [ 7 ]

14 голосов
/ 25 мая 2011

Различий в производительности нет, поскольку компилятор выполнит за вас вычисления.

Первый вариант может использоваться для явного разъяснения, что вы используете 24 заданных бита.Это сложнее сосчитать во втором варианте.

8 голосов
/ 25 мая 2011

По всей вероятности, разницы в производительности нет, поскольку компилятор выяснит, что ((1<<24) - 1) является константным выражением, и оценит его во время компиляции.

Мы можем только догадываться, почемуОригинальный автор кода решил написать так, как они это сделали.Возможно, они думали, что лучше выразить намерение («замаскировать все, кроме 24 наименее значимых битов b»).

Если бы это было их рассуждением, я лично склонен с ними согласиться.

2 голосов
/ 25 мая 2011

Если он не является частью большого блока кода, мне больше нравится ваше использование 0xFFFFFF.

Но, возможно, оно может быть частью группы похожих операторов.Тогда версия смещения (возможно) лучше.

switch (binaryprefix) {
    default:       a = 0;                   break;
    case DECABIN:  a = b & ((1 <<  1) - 1); break;
    case HECTOBIN: a = b & ((1 <<  2) - 1); break;
    case KILOBIN:  a = b & ((1 <<  3) - 1); break;
    case MEGABIN:  a = b & ((1 <<  6) - 1); break;
    /* ... */
    case ZETTABIN: a = b & ((1 << 21) - 1); break;
    case YOTTABIN: a = b & ((1 << 24) - 1); break;
}
2 голосов
/ 25 мая 2011

Я не вижу никакой выгоды с точки зрения производительности, как говорит Экс.

Мне, во всяком случае, кажется, что в первой версии лучше понять, что константа равна 2 ^ 241, чем последняя форма.Конечно, я думаю, это просто мнение.

1 голос
/ 25 мая 2011

Как правило, вам следует избегать использования таких утверждений, как первое.

Единственный сценарий, который я могу придумать, что первое предложение было бы предпочтительным, это если число 24 имеет значение.(Который должен быть определен и назван так или иначе.)

Например, если по какой-то причине в этой строке кода это может быть 24, а в другом месте это может быть 22.

1 голос
/ 25 мая 2011

Нет выгоды в производительности для выполнения ((1<<24) - 1). Это может быть медленнее, поскольку он должен выполнять некоторые операции (<< и -), в то время как 0xFFFFFF является константой. В лучшем случае компилятор вычислит 1-е во время компиляции, и они будут эквивалентны.

0 голосов
/ 25 мая 2011

Строго говоря, выражение

(1<<24)

является непереносимым и может иметь неопределенное поведение, поскольку 1 рассматривается как int, а стандарт гарантирует только 16 битов для int.Если вам все еще приходится писать код для такой реализации ... Если a и b являются целочисленными значениями, то вы можете смело сделать вывод, что целью являются только более современные реализации, имеющие, конечно, целые числа с 32 или более битами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...