本文主要是介绍神秘常量0x077CB531,德布莱英序列的恩赐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文发布于游戏程序员刘宇的个人博客, 转载请注明来源,博客园同步更新https://www.cnblogs.com/xiaohutu/p/10950011.html
某天我在优化游戏的算法,在将一个个关键数据结构优化全部成位操作后,最终来到最后一座大山前,如何快速计算出这个数值的二进制表示中最后一位的1在哪一位?
首先,我们已知:
将二进制只保留最后一位1的算法:
v & -v 的原理
已知IEEE对有符号整数中负数的定义是所有数值位取反+1,首位填1,首位这样正负数加起来既可以为0。
例如:一个8位的整数
A = 0001 1000, 取反 0110 0111, 取反加1 0110 1000,首位填1得到 -A = 1110 1000
A + -A 正好加到最高一位进位后为 0000 0000因为取反的时候加1,所以A最后一个为1的位取反后为0,下面我们称为第N位
取反后的第N位为0,后面全为1,再加1后的数值上第N位变成1,后面全为0
此时A和-A里,第N位之后的位全为0,第N位之前的位全为反
所以两个数进行与操作,只有第N位为1
即: 0001 1000 & 1110 1000 = 0000 1000
那么,如何将v&-v转换成N呢?
德布莱英序列
我看到了一段代码
这篇关于神秘常量0x077CB531,德布莱英序列的恩赐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!