从C中的无符号长整数中获取位

时间:2018-04-08 16:44:53

标签: c

我想从无符号长整数中得到n位。 我有这个无符号的功能,我真的不能把它放到unsigned long,经过这几个小时,请帮助我。

unsigned long getbits(unsigned long x, int p, int n){

    return (x >> (p - n + 1)) & ~(~0 << n);
}


int main() {

    printf("getbits(0x12341234abcdabcd, 31,4): 0x%016lu\n", getbits(0x12341234abcdabcd, 63, 40));
    return 0;
}

输出为0x0000000000000171而不是0x0012341234abcdab

2 个答案:

答案 0 :(得分:2)

您的代码中有2个错误:

  • 在功能getbits中,您需要使用0UL代替0
    因为~00xFFFFFFFF,但~0UL0xFFFFFFFFFFFFFFFFUL
  • printf来电中,您需要使用%016lx代替%016lu
    因为你想要十六进制输出而不是十进制输出。

答案 1 :(得分:1)

在此表达式中

(~0 << n)

0的类型为int

如果您想使用较大的类型,则需要

(~0ul << n)