Re: [問題] 新手的Macro問題

看板C_and_CPP作者 (鬼翼&娃娃魚)時間14年前 (2010/04/28 01:03), 編輯推噓5(506)
留言11則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《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
這真是一個概念很簡單 可是文字解釋起來很煩的事情 XD
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
不知道如果b如果是2的n次方,c = ((a>>n)+1)<<n; 好不?
04/28 17:57, 6F

04/28 18:00, , 7F
不過我覺得除非是效率瓶頸,還是用可讀性比較好的做法
04/28 18:00, 7F

04/28 18:12, , 8F
看錯...我以為是 > a ..... >///<
04/28 18:12, 8F

04/28 18:24, , 9F
修一下 c = ((a+(b-1))>>n) << n; 應該就行啦:)
04/28 18:24, 9F

04/28 18:25, , 10F
其實這些都在針對2的整數次方的倍數加速, 能用macro或
04/28 18:25, 10F

04/28 18:26, , 11F
inline包裝好一點, 寫個註解算法起來應該也OK啦XD
04/28 18:26, 11F
文章代碼(AID): #1BrnZQSh (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BrnZQSh (C_and_CPP)