位运算向上取整
在看UE4源码的时候发现了一个略骚的操作,在判断收到的比特流占据多少字节时利用了位运算的方式取整去申请空间来保存这些比特流。
在这里做个理解和扩展。
假设收到比特流157位,利用位运算如何得出占据多少个字节。
157+7>>3得到20字节。
//157+7>>3的二进制过程为:(假设用8位表示) 10011101 + 111 -------------- 10100000 >>3 -------------- 00010100=20
如果用人话来对157向上取整的做法:157除以8,如果有余数就对结果+1。
这里位运算蕴含的思想是:除以8,在位运算中就是右移3位丢掉最后的3位。因为是向上取整,所以如果最后3位中只要有一个1,我就不能单纯地丢掉这3位。我都需要将第四位+1,表现出来的形式就是+7。
看一下7的二进制表示就很明显了。
7的二进制是0000 0111,
如果某个数的最后3位只要有一个1,再加上7,那么最终都会进位导致这个数的最后第四位+1,实现了向上取整的效果。然后再右移3位,实现了除法的效果。
扩展:
因为右移一次就是除以2的效果。
所以某个数想要对除数K=2Y向上取整,都可以用这个公式:X + (K-1) >> Y