在下面的一段代码中(我稍微改了一下)假设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,其中referene &data[row >> 6]
应该指向?
上面的代码应该改变数据变量中的一些位,如何解释这个?
答案 0 :(得分:0)
好看后仔细看看现在看起来很清楚。 代码只是将int 64bit值中的一些位设置为掩码数组标志。
在单个64位数字中,我们可以有64个不同的位标志位置,但是如果我们需要比这个数字更多的标志位置,那么我们必须并排采用一个64位数字。 numwords
分配这样的64位整数数,因为它由row
/ 64除法的商显示(右移1等于除2)。
现在,要访问正确的64位掩码阵列,我们几乎做同样的事情。首先,我们尝试找到哪个64位数组标志属于给定的private static ArrayList<String> getHypernymTerm( PointerTargetNodeList ptnl,
ArrayList<String> parent2, String str )
throws JWNLException{
ArrayList<String> parent = parent2;
if ( !str.equals("entity") ) {
for (Iterator<?> itr = ptnl.iterator(); itr.hasNext();) {
PointerTargetNode node = (PointerTargetNode) itr.next();
Synset synset = node.getSynset();
String term = synset.getWord(0).getLemma();
parent.add(term);
PointerTargetNodeList targets = new PointerTargetNodeList(synset.getTargets(PointerType.HYPERNYM) );
if (targets.size() > 0) {
parent = getHypernymTerm( targets, parent, term);
}
}
}
return parent;
}
数字。如果行&gt;然后63放置到下一个64位位掩码数组(一个大于63且小于128的数字,它向右移动6,返回0)。之后我们可以设置适当的位标志。