如何读取整数中每N位?64位有符号整数按4位读取的代码问题排查
问题原因
- 4位值读取逻辑错误:你当前使用
byte(a) >> 4的写法,会先取a的低8位,再提取这8位的高4位。循环到第16次时,a已经累计右移了15次共60位,仅剩最高4位的有效数值0x1,此时a的低8位为0x01,高4位全为0,右移4位后自然输出0,不符合预期。 - 有符号整数位移风险:
int64是有符号整数,右移属于算术右移,位移时会补充符号位。虽然本次使用的正数不会触发问题,但如果处理负数会导致高位移入1,干扰读取结果。
修复方案
正确逻辑是每次直接提取a的低4位(通过和0xf按位与实现),同时先将int64转为无符号uint64避免算术右移问题,修复后代码如下:
a := int64(1229782938247303441) // 转为无符号整数消除算术右移影响 unsignedA := uint64(a) for i := 0; i < 16; i++ { // 取当前最低4位的值 fmt.Printf("%v\n", unsignedA & 0xf) unsignedA >>= 4 }
运行后会连续输出16个1,和预期结果一致。
内容的提问来源于stack exchange,提问作者DogOrCat
相关产品推荐
相关产品推荐

