2013-10-20 34 views
2

給定一個unsigned char *x,我需要將*x指向的地址四捨五入到16的倍數。如0x7fff5fbff7fc降到0x7fff5fbff7f0。我試着使用來接班:我如何四捨五入一個地址下降到16的倍數

x >> 4; 
x << 4; 

也試過

x >>= 4; 
x <<= 4; 

,但它不會讓我做這件事考慮到它是不是一個整數。有什麼建議?

+0

,它帶着面具? –

+1

(在'(char *)((uintptr_t)(x)&〜(uintptr_t)(15))'...) – 2013-10-20 18:26:31

+0

讓我試試看 –

回答

0

嘗試x & 0xfffffff0至少爲32位整數。

+3

這在非32位實現中會失敗,不必強制轉換爲整數 – 2013-10-20 18:27:19

7
(unsigned char *)((uintptr_t)(x) & ~(uintptr_t)(15)) 
如果你想成爲便攜式

...

+1

請解釋一下:) – HamZa

+0

@HamZa'〜(uintptr_t)15'是15的位置否定,即i。即'0xffff ... fff0'(這是一個'uintptr_t',因此它和指針一樣長)。如果你用它按位與指針,你將它四捨五入到16s。 – 2013-10-20 18:37:24