在C中,如何连接不同长度的部分?

时间:2018-03-30 15:14:36

标签: c long-integer

给定一个随机数组的无符号长位,例如:

ionViewWillEnter

如何编写将bits = { 0xABCDEF001234567A, 0x98761111FCDFEC80 };的位返回unsigned long getbits(unsigned long bits[], unsigned idx, unsigned len)的方法idx

例如,idx + len - 1会返回getbits(bits, 56, 20)

1 个答案:

答案 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;
}