当我浏览opencv的c ++头文件时,碰巧在(ptr + n-1) & -n
函数中看到了构造alignPtr
。完整的功能如下
/*!
Aligns pointer by the certain number of bytes
This small inline function aligns the pointer by the certain number of bytes by shifting
it forward by 0 or a positive offset.
*/
template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))
{
return (_Tp*)(((size_t)ptr + n-1) & -n);
}
你能解释它是如何运作的吗?
答案 0 :(得分:1)
在此表达式中隐含n
是2
的强大力量,例如2
,4
,8
等。让我们说{{1}是} n
在二进制补码二进制系统中:
2^m
是...... 11110 -2
是...... 11100 -4
是...... 11000 一般来说,-8
的表示恰好是n = -2^m
最右边的数字为零。
这意味着,如果我们将m
与&
一起使用,那么它将返回-2^m
最右边的数字为零,其他数字保留,这使得回答 m
的倍数。
这意味着表达式2^m
将有效地&#34; floor&#34;数字为x & -2^m
的最大倍数,小于或等于2^m
。
正在完成x
的添加:
(n - 1)
有效地改变了这个地板&#34;到&#34;四舍五入&#34;。