代码之家  ›  专栏  ›  技术社区  ›  Maverick

int指针引用数据

  •  -3
  • Maverick  · 技术社区  · 6 年前

    在下面这段代码中(我做了一点修改),假设 row 15个 .问题是,是否 &data[row >> 6] 引用的地址是否超出了其最小地址值?

        uint64_t volatile *data;
        int numRows = 45;
    
        numWords = (numRows + 63) >> 6;
        data= new uint64_t[numWords];
        memset((void*)data, 0, sizeof(uint64_t) * numWords);
    
        int row = 15;
        uint64_t bit = 1LL << (row & 63);
        Or64(&data[row >> 6], bit);
    

    运行一个修改过的代码,我注意到 &data[1] 指向起始地址 +8个 ,请 &data[2] 起始地址 +16 等等。

    因此,如果数据变量的起始地址(64位长度)是0x00000001,则引用 &数据[第6行] 应该指向吗?

    上面的代码应该改变数据变量中的一些位,如何解释?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Maverick    6 年前

    好吧,仔细看后,现在看起来很清楚了。 代码只是将int 64位值中的一些位设置为掩码数组标志。

    在一个64位数字中,我们可以有64个不同的位标志位置,但是如果我们需要比这个数字更多的标志位置,那么我们必须并排多取一个64位数字。这个 data= new uint64_t[numWords]; 分配64位整数的数目,如 numwords /64除法(右移1等于除以2)。

    现在,为了访问正确的64位掩码数组,我们做了几乎相同的事情。首先,我们尝试找出64位数组标志属于给定的 row 数字。如果第63行,则将放置到下一个64位位掩码数组(大于63小于128的数字右移6,则返回0)。之后,我们可以设置适当的位标志。