Ну и намешали же Вам информацию в одном контексте!!! Оттого и сложно понять, возникает путаница.
Неплохо бы распределить части цитаты по мелким подтемам.
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).
C/C++
Для чего в логических операциях применяют дополнительный ~0 логический ноль?
Похожие вопросы
- Логический оператор И и ИЛИ в Си
- Почему отрицательное число умножив на 0, почучается минус ноль. Хотя должно быть просто ноль.
- Сколько раз нужно взять остаток от деления числа на кол-во единиц в его двоичном представлении, чтобы получить 0
- Найти решение уравнения(arccos(x-1)+x^3-4=0) на указанном диапазоне ([0.5;1.9]). используя численный метод-Метод Ньютона
- Код должен находить наименьшее число в массиве, но это всегда почему то 0. Где ошибка?
- Помогите с обработкой исключений. Как описать исключение того, что длины сторон треугольника не меньше 0?
- Учу с++, можете объяснить на пальцах? не понимаю работу условия в теле цикла... if ((i+1)%3 != 0)
- Кто нибудь, объясните мне нормально, ясно, на русском, зачем нужен return 0 в с++?
- Окей, все по новой. Что же на самом деле означает операция разыменования? C++
- C++ побитовые операции
~0
удобно использовать для определения разрядности машинного слова, правда для этого результат должен восприниматься как беззнаковый (unsigned).
Однако, в этом нет необходимости, всё запросто делается с помощи макроса sizeof