C语言如何通过位运算去掉unsigned long值的前导位截取目标低位
问题原因分析
你使用的掩码0xFFFFFFFFFFFFF超出了32位整数的取值范围,在大多数编程语言中,如果不显式指定字面量的位宽/无符号属性,该掩码会被默认识别为32位有符号整数,溢出后实际值为0,因此做与运算后得到的结果始终为0。
正确实现方法
- 方法1:先移位再提取,不需要使用长掩码,兼容性更强
核心逻辑是先右移48位取出包含目标位的高位段,提取出0xe后再左移回对应位置,以C/C++为例代码如下:
这种写法避免了长字面量溢出的问题,可读性也更高。unsigned long m = 0x401e000000000000UL; unsigned long f = ((m >> 48) & 0xf) << 48; - 方法2:给64位掩码添加无符号长整型后缀,确保掩码识别正确
如果你习惯直接用掩码提取,需要给字面量添加对应后缀(C/C++中为UL/ULL,其他语言可参考对应语法指定64位无符号类型):unsigned long f = m & 0xe000000000000UL;
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

