C/C++

Для чего в логических операциях применяют дополнительный ~0 логический ноль?

   Ну и намешали же Вам информацию в одном контексте!!! Оттого и сложно понять, возникает путаница.
   Неплохо бы распределить части цитаты по мелким подтемам.
 re:  Результатом последних может быть 0 или 1

✓ Строго говоря, результатом логических операций должны быть логические значения „ИСТИНА” и „ЛОЖЬ”. Это в соответствии с книжными истинами. Технически же мы имеем дело с цифровой машиной, которая может манипулировать электронными сигналами, которые в свою очередь математически кодируются двоичными цифрами (1 и 0). Именно поэтому технически допускается, что логические значения однозначно сопоставляются с числовыми, то есть 1 ≡ ИСТИНА (или true), 0 ≡ ЛОЖЬ (или false).
Естественно, логические значения должны использоваться там, где требуется булева логика (в условных выражениях). Но поскольку фактически они представлены числами, значит, их можно использовать в любых числовых выражениях. Язык Си это позволяет. А следом за ним и Си++.
Пример: true + true. Знак „+” однозначно указывает на то, что должно быть сложение. Однако, сложения логических значений не существует, есть суммирование чисел! Поэтому каждое логическое значение преобразуется в эквивалентное число, после чего оба аргумента складываются, получается числовой результат 2.

 re:  !0 имеет значение 1, тогда как ~0 представляет собой набор разрядов "все единицы"…

✓ Ну, так операция “восклицательный знак” относится к логическим операциям, то есть воспринимает свой аргумент и возвращаемое значение как логические величины (true/false). Да, !0 это запись not false, поэтому! 0→1 (в смысле not false → true), это соответствует булевой логике. А операция “волнистая черта” всё-таки из числовых, арифметических операций, стало быть такое отрицание производится над отдельными битами числа. Число 0 и есть число, оно представляется цепочкой из двоичных нулей (0000000000000000). И поразрядное отрицание приводит к замене всех двоичных нулей двоичными единицами (1111111111111111). Нетрудно заметить, что логическое отрицание и поразрядное отрицание дают разные результаты с одинаковыми аргументами: !0 ≠ ~0.

 re:  …который обычно является значением -1 в дополнительном коде

Да, это факт. Вот только ценности в этом нет, проще записать -1

◉ И наконец, ответ на Ваш вопрос. Для чего в логических операциях применять поразрядное отрицание нуля??? В логических? Поразрядное? Пфф!!! Совсем не рационально! Ведь поразрядное отрицание нуля (~0) даёт ненулевой результат, а в логических выражениях это преобразуется к true. Но тогда проще обойтись без преобразований совсем, для этой цели есть логическое отрицание нуля (!0).
Вадим Кучаев
Вадим Кучаев
16 172
Лучший ответ
Вадим Кучаев Запись

     ~0

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

Однако, в этом нет необходимости, всё запросто делается с помощи макроса sizeof