神秘常量0x077CB531,德布莱英序列的恩赐

本文探讨了在游戏开发中优化算法时遇到的问题,如何快速找到数值二进制表示中最后一位1的位置。通过德布莱英序列和常量0x077CB531,解释了如何进行位操作计算。德布莱英序列是一种特殊的二进制序列,其性质使得它能够描述所有N位长度的二进制数字集合。文章还提到了生成这种序列的不同方法,包括暴力遍历、递归法和本原多项式方法。
摘要由CSDN通过智能技术生成

 

本文发布于游戏程序员刘宇的个人博客, 转载请注明来源,博客园同步更新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呢?

德布莱英序列

我看到了一段代码

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值