Jest this postu, który niedawno otrzymał jakiś niezwykły bukiet upvotes, prosząc o operatora w C +
To pokazuje następujące realizacja:Czy ta pełna implementacja dodatku jest poprawna?
// replaces the + operator
int add(int x, int y) {
while(x) {
int t = (x & y) <<1;
y ^= x;
x = t;
}
return y;
}
Przypadkowo napisałem realizację siebie zbyt (an algorytm zeszyt) i wymyślił, że:
uint32_t bit_add(uint16_t a, uint16_t b) {
uint32_t carry = ((uint32_t) a & b) << 1;
uint16_t add = a^b;
return carry^add;
}
Przetestowałem go kilka razy i wydaje się działać. Chodzi o to, że jest znacznie szybszy niż implementacja ze wskazanego postu, bez żadnych skoków na x86.
Czy moja implementacja jest poprawna lub czy jest coś złego, o czym nie wiem?
Nie mogę sobie wyobrazić, że mój kod jest szybszy niż kod postu tak często oglądany i sprawdzany.
Nie sprawdziłem, ale może to być poprawne. Nie zakładaj, że ludzie piszą najbardziej efektywny kod możliwy przez cały czas; Po tym wszystkim odpowiedzi były najczęściej tworzone dla problemów z zabawkami lub dla celów demonstracyjnych, a nie dla rzeczywistego użycia (+ jest jeszcze szybsze). – Cubic
Dwa przykłady są różne, pierwszy działa jeden bit na instrukcję w pętli, w twoje wszystkie bity mają wpływ. Kompilator może również zoptymalizować twój kod. – purplepsycho
Spróbuj dodać 3 i 7, wyprowadza 2. – Kenney