Re: [問題] 新手的Macro問題
※ 引述《ILike58 (小菊花)》之銘言:
: 不知道問這樣的問題會不會觸犯板規?
: 看到一個巨集是這樣寫的:
: _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
: 不是很清楚 + sizeof(int) - 1這個值後再去對它做&的意思在哪?
: 有查到好像是為了對記憶體做對齊,但很難懂他的簡潔想法。
這個問題, 即要找某整數c, 它>=a, 又是最小的b的倍數.
直覺的作法是:
if(a % b == 0)
c = a;
else
c = a - (a%b) + b;
// 或, c = (a/b) * b + b;
條件判斷容易影響程式執行的效率, 所以另一個作法:
c = ( (a + (b-1)) / b ) * b;
這裡的數學都可以自己推推看, 如果有興趣的話....XD
==
但是, 如果b一定是2的整數次方, 計算方式又可以有點不同了....
一個數如果是2的整數次方, 其二進位值N個bits裡一定恰一個bit為1....
該數的任意整數倍, 肯定在那個為1的bit的更高位才會有其他的1....
(自己推, 這就是任意整數 乘2 除2 與 << >> 的關係)
而該2的整數次方-1, 必然形成該數原為1的bit變為0, 低1 bit開始全為1....
於是透過簡單的(你看到那段)bit mask運算, 可以連除法都不用, 就找出c....
Ex1: a為b的倍數
b = 00000100b
b-1 = 00000011b
a = 00100100b
a+(b-1) = 00100111b
& ~(b-1) = 11111100b
-----------------------------
c = 00100100b
Ex2: a不是b的倍數
a = 00100110b
a+(b-1) = 00101001b
& ~(b-1) = 11111100b
-----------------------------
c = 00101000b
==
以上, 部份略過沒提的二進位數的特性就麻煩自己去查一下吧@_@"
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.174.98
→
04/28 01:05, , 1F
04/28 01:05, 1F
推
04/28 02:02, , 2F
04/28 02:02, 2F
→
04/28 02:25, , 3F
04/28 02:25, 3F
→
04/28 07:39, , 4F
04/28 07:39, 4F
推
04/28 11:19, , 5F
04/28 11:19, 5F
Edit: 修一下 直覺作法 那邊的一個誤算, // 裡應該是 +b 不是 +1
※ 編輯: VictorTom 來自: 220.134.41.4 (04/28 11:42)
推
04/28 17:57, , 6F
04/28 17:57, 6F
推
04/28 18:00, , 7F
04/28 18:00, 7F
推
04/28 18:12, , 8F
04/28 18:12, 8F
→
04/28 18:24, , 9F
04/28 18:24, 9F
→
04/28 18:25, , 10F
04/28 18:25, 10F
→
04/28 18:26, , 11F
04/28 18:26, 11F
討論串 (同標題文章)