看到他人有如下代码片段,可以使用哨兵和表驱动进行优化
uint32_t PbInt64Size(int64_t value) {
if ((value & (0xffffffffffffffffL << 7)) == 0) {
return 1;
} else if ((value & (0xffffffffffffffffL << 14)) == 0) {
return 2;
} else if ((value & (0xffffffffffffffffL << 21)) == 0) {
return 3;
} else if ((value & (0xffffffffffffffffL << 28)) == 0) {
return 4;
} else if ((value & (0xffffffffffffffffL << 35)) == 0) {
return 5;
} else if ((value & (0xffffffffffffffffL << 42)) == 0) {
return 6;
} else if ((value & (0xffffffffffffffffL << 49)) == 0) {
return 7;
} else if ((value & (0xffffffffffffffffL << 56)) == 0) {
return 8;
} else if ((value & (0xffffffffffffffffL << 63)) == 0) {
return 9;
}
return 10;
}
优化后代码如下,可以去除繁琐的IF判断,同时优化性能:
- 使用Mask表来替换缩写的各处mask
- 在Mask表最后一位添加哨兵
int []byteMask = {0xffL, 0xff00L, 0xff0000L, ... 0xff0000000000L, 0}; // 最后的0是哨兵
int i = 0
while ((value & byteMask[i])) {
i++;
}
return i;