#define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16))
#define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * (((y) + (1L << 15)) >> 16))
1、請問上面的寫法是甚麼意思?是不是相乘取四捨五入???
2、者兩者有運算速度的差別嗎?
2006-12-13 09:35:19 · 1 個解答 · 發問者 speed 2 in 電腦與網際網路 ➔ 程式設計
首先要知道 >> 和 << 的意思.
它們都是針對二進位做運算.
在十進位中 如果把數字往右移一位 (等於 小數點往左移一位)
就相當於除以10.
反之 則是乘以10.
二進位中, 往右移一位就相當於除以 2. 反之, 則是乘以 2.
所以
#define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16))
是把 x 除以 2^12, 把 y 除以 2^16, 然後相乘.
1L 是把這個 1 宣告成長整數 (否則 當它大於 65535 時會變成負數).
把 1 乘以 2^11 再除以 2^12 (15 和 16亦同) 的值是 0.5
所以
#define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * (((y) + (1L << 15)) >> 16))
是把 x 除以 2^12, 做四捨五入; 把 y 除以 2^16, 做四捨五入; 然後相乘.
理論上來說, 第二式一定比第一式慢一些, 因為它多做了一些工作.
但是, >> 和 << 的速度是相當快 (x >> 12 遠比 x / 4096 快多了).
所以你應該感覺不到.
2006-12-13 19:19:50 · answer #1 · answered by JJ 7 · 0⤊ 0⤋