給定一個unsigned char *x
,我需要將*x
指向的地址四捨五入到16的倍數。如0x7fff5fbff7fc
降到0x7fff5fbff7f0
。我試着使用來接班:我如何四捨五入一個地址下降到16的倍數
x >> 4;
x << 4;
也試過
x >>= 4;
x <<= 4;
,但它不會讓我做這件事考慮到它是不是一個整數。有什麼建議?
給定一個unsigned char *x
,我需要將*x
指向的地址四捨五入到16的倍數。如0x7fff5fbff7fc
降到0x7fff5fbff7f0
。我試着使用來接班:我如何四捨五入一個地址下降到16的倍數
x >> 4;
x << 4;
也試過
x >>= 4;
x <<= 4;
,但它不會讓我做這件事考慮到它是不是一個整數。有什麼建議?
嘗試x & 0xfffffff0
至少爲32位整數。
這在非32位實現中會失敗,不必強制轉換爲整數 – 2013-10-20 18:27:19
(unsigned char *)((uintptr_t)(x) & ~(uintptr_t)(15))
如果你想成爲便攜式
...
請解釋一下:) – HamZa
@HamZa'〜(uintptr_t)15'是15的位置否定,即i。即'0xffff ... fff0'(這是一個'uintptr_t',因此它和指針一樣長)。如果你用它按位與指針,你將它四捨五入到16s。 – 2013-10-20 18:37:24
,它帶着面具? –
(在'(char *)((uintptr_t)(x)&〜(uintptr_t)(15))'...) – 2013-10-20 18:26:31
讓我試試看 –