2014-03-24 184 views
0

說明需要ROUND_DOWN宏觀

#define ROUND_DOWN(x, s) ((x) & ~((s)-1)) 

我不太明白的部分((x) & ~((s)-1))。我會非常感謝你的解釋。

+3

這是使用一個位掩碼從'x'中剔除較低的'log2(s)'位。 –

+0

我從來沒有見過這個宏,它需要's'是一個二的冪? –

+0

@MooingDuck,是的,'s'需要是'2'的力量才能讓宏理解。 – lurker

回答

4

所以,這是一個可能的用法是:

ROUND_DOWN(152, 128); 

讓我們看看會發生什麼:

~(128 - 1) == ~(127) 
      == ~(0x7F) 
      == 0xFFFFFF80 

所以,我們似乎被掩蓋了一些低位。

ROUND_DOWN(152, 128) == (152 & 0xFFFFFF80) == 128 
ROUND_DOWN(300, 128) == (300 & 0xFFFFFF80) == 256 

此外,s也必須是2的宏並沒有太大的數學意義上,否則電力。

0

分手。 〜表示按位不是因此C = 00001100和〜C = 11110011例如。

&是按位AND因此,您正在計算!((s)-1)和(x)的值。

這當然意味着只有在兩個值都設置了一個位時,結果纔會有一些設置。

例如,保持在低4位,考慮的是X = 15,S = 13

s - 1 = 12 = 0xC - 1100 
~(s - 1) = 0011 
x & ~(s-1) = 1111 & 0011 = 0011 
,另一方面

如果x = 14你會得到1110 & 0011 = 0010

+0

非常感謝! – user3457123