Спроба відповісти як на явне запитання (що таке CHAR_BIT), так і на неявне запитання (як це працює) у вихідному питанні.
Символ на мовах C та C ++ являє собою найменшу одиницю пам'яті, на яку може звернутися програма C *
CHAR_BIT в C і C ++ представляє кількість бітів у символі. Завжди має бути принаймні 8 через інші вимоги до типу char. На практиці на всіх сучасних комп'ютерах загального призначення це рівно 8, але деякі історичні або спеціалізовані системи можуть мати вищі значення.
Java не має еквівалента CHAR_BIT або sizeof, у цьому немає необхідності, оскільки всі примітивні типи в Java мають фіксований розмір, а внутрішня структура об'єктів є непрозорою для програміста. При перекладі цього коду на Java ви можете просто замінити "sizeof (int) * CHAR_BIT - 1" на фіксоване значення 31.
У цьому конкретному коді він використовується для обчислення кількості бітів в int. Майте на увазі, що в цьому обчисленні передбачається, що тип int не містить бітів заповнення.
Якщо припустити, що ваш компілятор вирішив підписати розширення на бітові зсуви підписаних чисел і припустивши, що ваша система використовує представлення доповнення 2s для від'ємних чисел, це означає, що "MASK" буде 0 для позитивного або нульового значення і -1 для негативного значення.
Щоб заперечити число доповнення двох, нам потрібно виконати побітове значення, а не додати одне. Еквівалентно ми можемо відняти один, а потім побітово заперечити його.
Знову ж таки, якщо припустити, що представлення доповнення двійки -1 представлене всіма, тому ексклюзив або з -1 еквівалентний розрядному запереченню.
Отже, коли v дорівнює нулю, число залишається одне, коли v дорівнює одиниці, воно заперечується.
Потрібно пам’ятати, що переповнене знаком у C та C ++ є невизначеною поведінкою. Отже, використання цієї реалізації ABS на найбільш негативному значенні призводить до невизначеної поведінки. Це можна виправити, додавши закиди таким чином, що кінцевий рядок програми обчислюється в unsigned int.
* Що, як правило, але не нецерально те саме, що найменша одиниця пам'яті, до якої може звернутися апаратне забезпечення. Реалізація може потенційно об'єднати кілька одиниць апаратно-адресної пам'яті в одну одиницю програмно-адресної пам'яті або розділити одну одиницю апаратно-адресної пам'яті на кілька одиниць програмно-адресної пам'яті.