Знайдений вами код намагається пояснити, наскільки примітивне комп'ютерне обладнання може реалізувати інструкцію "додати". Я кажу "може", бо можу гарантувати, що цей метод не використовується будь-яким процесором, і я пояснити, чому.
У звичайному житті ви використовуєте десяткові числа і навчилися їх додавати: Щоб додати два числа, ви додаєте найменші дві цифри. Якщо результат менше 10, ви записуєте результат і переходите до наступної цифри. Якщо результат 10 або більше, ви записуєте результат мінус 10, переходите до наступної цифри, купуючи пам'ятаєте, додати ще 1. Наприклад: 23 + 37, ви додаєте 3 + 7 = 10, ви записуєте 0 і пам’ятаєте додати ще 1 для наступної позиції. У позиції 10 секунд ви додаєте (2 + 3) + 1 = 6 і записуєте це. Результат - 60.
Ви можете зробити те саме те саме з двійковими числами. Різниця полягає в тому, що єдиними цифрами є 0 і 1, тому єдино можливими сумами є 0, 1, 2. Для 32-бітового числа ви б обробляли одну цифру позиції за іншою. І саме так це могло б зробити справді примітивне комп'ютерне обладнання.
Цей код працює по-різному. Ви знаєте, що сума двох двійкових цифр дорівнює 2, якщо обидві цифри дорівнюють 1. Отже, якщо обидві цифри дорівнюють 1, тоді ви додасте ще 1 на наступну двійкову позицію і запишете 0. Ось що робить обчислення t: Він знаходить усі місця де обидві двійкові цифри дорівнюють 1 (це &) і переміщує їх у наступну цифру (<< 1). Потім виконується додавання: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 дорівнює 2, але ми записуємо 0. Це те, що робить ексклюзив або оператор.
Але всі одиниці, які вам довелося обробити в наступній цифрі, не оброблено. Їх ще потрібно додати. Ось чому код робить цикл: У наступній ітерації додаються всі зайві одиниці.
Чому жоден процесор не робить це так? Тому що це цикл, і процесори не люблять цикли, і це повільно. Це повільно, оскільки в гіршому випадку потрібно 32 ітерації: Якщо до числа 0xffffffff (32 1-біта) додати 1, то перша ітерація очищає біт 0 з y і встановлює x на 2. Друга ітерація очищає біт 1 з y і встановлює x на 4. І так далі. Щоб отримати результат, потрібно 32 ітерації. Однак кожна ітерація повинна обробляти всі біти x і y, для чого потрібно багато обладнання.
Примітивний процесор робив би все так само швидко, як ви робите десяткову арифметику, від найнижчого положення до найвищого. Також потрібно 32 кроки, але кожен крок обробляє лише два біти плюс одне значення з попередньої бітової позиції, тому набагато легше реалізувати. І навіть у примітивному комп’ютері можна дозволити собі це робити без необхідності впроваджувати цикли.
Сучасний, швидкий і складний центральний процесор використовуватиме "умовний суматор". Особливо, якщо кількість бітів велика, наприклад, 64-бітний суматор, це економить багато часу.
64-розрядний суматор складається з двох частин: По-перше, 32-розрядний суматор для найнижчого 32 біта. Цей 32-бітний суматор видає суму та "перенесення" (показник того, що 1 потрібно додати до наступної бітової позиції). По-друге, два 32-бітових суматора для вищих 32 бітів: Один додає x + y, інший додає x + y + 1. Всі три суматори працюють паралельно. Потім, коли перший суматор здійснив перенесення, центральний процесор просто вибирає, який з двох результатів x + y або x + y + 1 є правильним, і ви отримаєте повний результат. Отже, 64-розрядний суматор займає лише трохи більше часу, ніж 32-розрядний суматор, а не вдвічі довше.
32-бітові частини суматора знову реалізовані як умовні суматори суми, використовуючи безліч 16-бітових суматорів, а 16-бітові суматори - умовні суматори суми тощо.
add
машинну інструкцію, яку, мабуть, майже всі процесори мають і реалізують як апаратний додаток, який працює за кілька годин.