Первая форма определенно не предпочтительна, и я бы сказал, что она не должна использоваться никогда . В системе дополнения единиц, которая не поддерживает отрицательный ноль, ~0
вполне может быть представлением ловушки и, таким образом, вызывать UB при использовании.
С другой стороны, 1<<31
также является UB, предполагая, что int
является 32-разрядным, поскольку он переполняется.
Если вы действительно имеете в виду 31 как константу, 0x7fffffff
- это самый простой и правильный способ написать свою маску. Если вам нужно все, кроме знакового бита int
, INT_MAX
- это самый простой и правильный способ написания вашей маски.
Пока вы знаете, что битовое смещение не будет переполнено, (1<<n)-1
является правильным способом создания маски с самыми низкими установленными битами n
. Может быть предпочтительнее использовать (1ULL<<n)-1
с последующим приведением или неявным преобразованием, чтобы не беспокоиться о проблемах подписи и переполнения в смене.
Но что бы вы ни делали, не используйте оператор ~
со знаком целых чисел. Когда-либо.