(ptr + n-1)&这个表达式做了什么?

时间:2016-06-06 12:15:47

标签: c++ opencv

当我浏览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);
}

你能解释它是如何运作的吗?

1 个答案:

答案 0 :(得分:1)

在此表达式中隐含n2的强大力量,例如248等。让我们说{{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;。