การหาค่าเฉลี่ยของ `unsigned int` 2 ตัวโดยไม่เกิดโอเวอร์โฟลว์
(devblogs.microsoft.com)- การนำมาบวกกันแล้วหาร 2 จะทำให้เกิดโอเวอร์โฟลว์
→ (a + b) / 2
- ถ้ารู้ว่าค่าไหนมากกว่า ก็สามารถนำผลต่างของสองค่ามาบวกกับค่าน้อยกว่าแล้วหาร 2 ได้
→ low + (high - low) / 2
- อัลกอริทึมที่ทำได้แม้ไม่รู้ว่าค่าไหนมากกว่ากัน สิทธิบัตรหมดอายุไปแล้วในปี 2016
→ (a / 2) + (b / 2) + (a & b & 1)
- SWAR : SIMD ภายในรีจิสเตอร์
→ (a & b) + (a ^ b) / 2
- ถ้าคอมไพเลอร์รองรับ 64 บิต ก็ใช้การแคสต์
→ ((unsigned long long)a + b) / 2
- หลังจากนั้นก็เป็นโค้ดแอสเซมบลีแยกตามโปรเซสเซอร์... โปรดดูต้นฉบับ
1 ความคิดเห็น
บล็อก The Old New Thing ของ Raymond Chen ครอบคลุมหัวข้อต่าง ๆ มากมาย ตั้งแต่เบื้องหลังการพัฒนา Windows ไปจนถึงเรื่องหลากหลายอื่น ๆ
ในเกาหลีเคยมีหนังสือแปลออกมาชื่อว่า "Raymond Chen's Windows Development 282 Stories" แต่ปัจจุบันเลิกพิมพ์แล้ว