在看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