如何简化位反转函数中基于模4余数的nibble对齐移位逻辑?
问题
我实现了一个可反转数字中位的函数,待反转数字的位数不固定。目前在函数末尾通过判断counter%4 != 0,将反转结果左移以对齐nibble,该逻辑可正常工作。现询问是否有无需条件判断的单行写法,实现基于模4余数的移位操作?
代码如下:
uint64_t revBits(uint64_t num) { unsigned int counter = 0; uint64_t reverse_num = 0; while (num) { reverse_num <<= 1; reverse_num |= num & 1; num >>= 1; counter++; } if (counter % 4 != 0) { reverse_num <<= (4 - counter % 4); } return reverse_num; }
解决方案
当然有,你可以利用模运算的数学特性直接计算移位位数,完全不需要条件判断。核心逻辑是:
- 当
counter % 4等于0时,移位位数为0,左移0位相当于不做任何操作 - 当
counter % 4不为0时,移位位数正好是4 - counter%4
你可以直接把原来的条件判断块替换成这行代码:
reverse_num <<= (4 - (counter % 4)) % 4;
甚至还能更简洁——在无符号整数的语境下,(4 - x%4) %4等价于(-x) %4(负数模运算会自动转为正数),所以也可以写成:
reverse_num <<= (-counter) % 4;
测试几个典型场景验证逻辑:
counter=3:(-3)%4=1,左移1位,符合预期counter=4:(-4)%4=0,左移0位,无需操作counter=5:(-5)%4=3,左移3位,和4-5%4结果一致,正确
替换后的完整函数:
uint64_t revBits(uint64_t num) { unsigned int counter = 0; uint64_t reverse_num = 0; while (num) { reverse_num <<= 1; reverse_num |= num & 1; num >>= 1; counter++; } reverse_num <<= (-counter) % 4; // 单行无判断实现 return reverse_num; }
内容的提问来源于stack exchange,提问作者Engineer999
相关产品推荐
相关产品推荐

