给定一个随机数组的无符号长位,例如:
ionViewWillEnter
如何编写将bits = { 0xABCDEF001234567A, 0x98761111FCDFEC80 };
的位返回unsigned long getbits(unsigned long bits[], unsigned idx, unsigned len)
的方法idx
?
例如,idx + len - 1
会返回getbits(bits, 56, 20)
。
答案 0 :(得分:2)
假设long
为64位,假设len
不大于64,则可以执行以下操作:
首先将idx
除以64得到数组索引,然后用64修改得到起始位数。
首先获取有问题的数组元素并向左移位位索引,然后向右移位位索引。这将移除左侧的额外位并重新开启0。
现在从64减去位索引和长度。这将为您提供在右侧剥离的位数。如果结果是非负数,则向右移动该值并完成。如果结果为负,那么您需要从数组中的下一个元素中获取其余元素。首先将结果值偏移为否定值,以便为附加位腾出空间。然后抓住下一个数组元素并将其右移64 +负值,然后对该值和最终结果执行按位OR。
结果函数:
unsigned long getbits(unsigned long arr[], int idx, int len)
{
int bitlen = sizeof(unsigned long) * CHAR_BIT;
if (len > bitlen) {
printf("len too long\n");
return 0;
}
int arridx = idx / bitlen;
int bitidx = idx % bitlen ;
int rightshift = bitlen - bitidx - len;
unsigned long r = (arr[arridx] << bitidx) >> bitidx;
if (rightshift >= 0) {
r = r >> rightshift;
} else {
r = r << -rightshift;
r = r | (arr[arridx + 1] >> (bitlen + rightshift));
}
return r;
}