Если вы спросите конкретно, что истина/ложь (то есть равна нулю/не равна нулю) и дополнение к двум, то нет никакой разницы. (Тем не менее, вы возвращаете не просто значение истины, а допускаете разные битовые шаблоны для true
. Пока вызывающий абонент не различает, это нормально.)
Посмотрите, как формируется отрицание дополнений двух сторон: приращение. Поскольку вы принимаете только наименее значимые биты, для приращения не будет никакого переноса. Это необходимо, поэтому вы не можете делать это ни с чем, кроме диапазона наименее значимых бит.
Давайте посмотрим на этих двух случаях:
Во-первых, если три младших бит равны нулю (для false
эквивалент). Инвертирование дает все, приращение снова приводит к нулю. Четвертый и более значимые бит могут отличаться, но они не влияют на младшие значащие биты, и они не влияют на результат, поскольку они замаскированы. Так что это остается.
Во-вторых, если три младших разряда не все равны нулю (для эквивалента true
). Единственный способ, которым это может измениться на false
, - это когда операция инкремента оставляет их в нуле, что может произойти только в том случае, если они были все раньше, что, в свою очередь, могло произойти только в том случае, если все они были нулями перед инверсией. Этого не может быть, так как это первый случай. Опять же, более значимые биты не влияют на три младших бита, и они маскируются. Поэтому результат не меняется.
Но опять же, это работает только тогда, когда вызывающий объект учитывает только значение истины (все биты нуль/не все биты нуль), а когда маска допускает диапазон бит, начиная с наименее значимого без пробела.
Вы могли бы проверить себя довольно легко, не так ли? В общем, да, есть разница. –