C выражения не могут быть «быстрее» или «медленнее», потому что ЦП не может оценивать их напрямую.
Какой из них «быстрее», зависит от машинного кода, который ваш компилятор сможет сгенерировать для этих двух выражений.Если ваш компилятор достаточно умен, чтобы понять, что в вашем контексте оба делают одно и то же (например, вы просто сравниваете результат с нулем), он, вероятно, сгенерирует один и тот же код для обоих вариантов, что означает, что они будут одинаково быстрыми.В таком случае вполне возможно, что сгенерированный машинный код даже отдаленно не будет напоминать последовательность операций в исходном выражении (т. Е. Без сдвига и / или без побитового и).Если то, что вы пытаетесь сделать здесь, это просто проверить значение одного бита, то есть другие способы сделать это, кроме комбинации сдвиг-и-бит-по-и.И многие из этих «других способов» не могут быть выражены в C. Вы не можете использовать их в C, в то время как компилятор может использовать их в машинном коде.
Например, процессор x86 имеет выделенный битовыйтестовая инструкция BT
, которая извлекает значение определенного бита по его номеру.Таким образом, умный компилятор может просто сгенерировать что-то вроде
MOV eax, i
BT mask, eax
...
для обоих ваших выражений (при условии, что это более эффективно, в чем я не уверен).