如何在常量时间内找到格雷码中的下一位?
我有一个小的8位处理器,在某些输出线上有一个N对M解码器 - 例如,对于5到32位的情况,我写00101和位5改变状态。输出的唯一接口是change-state,没有回读。
设备快速(但随机)发生事件计数,并应将此计数作为“单个位更改”代码提供给另一个设备。输出引脚由另一个器件并行读取,并且可以像其他器件决定的那样快速或少量地读取,因此计数是必要的。
我不需要使用标准的Binary Reflective Gray代码 - 我可以使用任何单位更改代码。
但是,我希望能够跟踪下一位有效更改的位。
我没有“LowestBitSet”指令,并且在四个8位寄存器中找到最低位设置是循环消耗 - 所以我不能使用这种“常见”方法:
Keep binary counter A
Find B as A XOR (A+1)
Bit to change is LowestBitSet in B
我希望在尽可能少的内存和寄存器中计算它,并且对于任何大型查找表来说内存肯定是太受限制了。周期时间是更重要的因素。
关于算法的任何建议?
没有找到相关结果
已邀请:
7 个回复
掀辟髓观粟
如果展开循环,则最多2次加载,1次加载和5次加载(但几乎总是更少)。如果表没有256字节,则可以在半字节上使用相同的策略。
渐首洽陈染
期差骇蓟
逝媳蘑贩茄
始终为0。我认为你的意思是
,与
大致相同。 紧接着由AShelly连接的那个之前的比特笨拙的黑客在8位微观上将更加可行。 这应该使你的原始算法相当实用,产生
。 至于更改为不同序列的可能性,这也会生成格雷码,为了使计算更容易,这非常有趣,但我没有想出任何东西。
澜悍景哭苟
可以在1到4次执行中变化,具体取决于
的值。 这会更改计算位数所需的时间。 任何单个计算可能有4种不同的可能执行时间。 参见(货物崇拜编码员除外)以下所述理由的参考 这个恒定的时间要求(没有灯,没有车,没有一个豪华......甚至没有“桌子”):
然而,有一个更好,更舒适和更方便的方法来满足OP的标准。 对于货物编码目的,以下方便地最低限度地满足OP的条件(最大?;)。 每次只需两次操作即可找到要更改的位数:模数 (如果以模数done10ѭ完成,可以像bit12ѭ位一样简单
操作 即。常数
)和增量。 实际的约翰逊格雷码(JGC)序列是通过前面的代码逐步生成的 通过左移1到位数位置选择所需的位。 根据OP的要求,不需要这种计算。 约翰逊法典 ------------------------- 实际的格雷编码是无关紧要的,因此使用约翰逊计数器的格雷码非常简单。 请注意,约翰逊格雷码(JGC)密度是线性的,而不是像2或2那样的对数 二进制反射格雷码(BRGC)。 对于4字节的32位,序列可以在复位前从0到63进行计数。 /./ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /。
/./ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /。 测试输出:
使用此代码部分生成:
/ * 不幸的是,这个答案没有解释“你怎么样(我,我,......)找到......”。 有关找到此类解决方案和使用类似BRGC的方法的详细信息...... 见前面的参考:https://stackoverflow.com/a/42846062/7728918
郸身
在每次事件发生时执行。 否则,使用二进制反射格雷码和4字节基2计数器
,... 方法1 - 使用表格 * /
/方法2 - 没有表格* /
/ * Bit Bunnies和Cargo Cult Coders无需进一步阅读。 上述代码的执行效率取决于
的事实 在编译时计算为固定地址,这是非常传统的。 此外,使用按需调用优化编译器将加快数组内容 所以只需要计算一个索引值。 这种编译器的复杂性可能会丢失,但很容易手动组装 这样做的原始机器代码(基本上是一个开关,计算goto等)。 使用孤立代码分析上述算法,显示每个函数 call将执行完全相同的指令序列,优化与否。 在这两种方法中,非孤立的返回需要在那里处理案例 计数器在0上翻转,因此使用额外的索引和逻辑 (
)行动。这个额外发生在1/2的1/2的1/2或1/8的总计数, 在这个1/8的一个计数中,除了返回31之外无所事事。 第一种方法需要2个逻辑运算(
),1个加法和3个索引 计算总计数的7/8。单个计数为零,3个逻辑和 需要3个索引操作,其他1/8需要3个逻辑,1个加法 和4个索引操作。 执行方法2的最终代码(最佳编译),用于7/8的 计算,使用7个逻辑运算(
,最后是2的补码), 1次算术(
)和5次计算索引操作。另外1/8,但一个 例如,需要8个逻辑,1个加法和6个计算索引操作。 不幸的是,没有一丝神圣的灵感表现出任何货物代码。 这是一篇关于这篇作文如何发生的简要故事。 如何做到这一点涉及一项关键的初步调查,如记录: https://stackoverflow.com/a/42846062。 然后使用从评估开始的连续细化过程导出代码 这篇文章中的算法。 具体来说,这个答案:https://stackoverflow.com/a/4657711。 该算法从循环开销中执行的时间变量将是 通过减少回报计算,显着而突出地强调了这一点 单个添加和两个索引操作。 * /
/ ------------------------------------------------- ------------- -------------------------------- /
/ * 方法2有一个类似的年表。 该序列已被彻底衰减并缩写为中间示例: 无意中,https://stackoverflow.com/a/42865348中发布的代码是 不是按预期的专用字节大小。预期的代码在这篇文章中。 * /
/ * 在修辞上,我如何找到答案......只能明确回答 在个人意义上(见这个答案:https://stackoverflow.com/a/42846062)as 不可能代表其他人的认知能力。 https://stackoverflow.com/a/42846062的内容对于后台至关重要 信息和反映非常个人化 心理体操需要迂腐的机制来解决这个问题。 毫无疑问,环境和过多的材料令人生畏,但这正是如此 获得足够的洞察力,曲目,轶事所采取的个人方法 先例等等,用于推断和插入特定答案的答案, 什么程序完全符合标准。而且,这是非常“追逐”的 激发并激发(或许是病态的)心灵投入时间和精力 用好奇的追求来满足好奇心。 * /
递劝臼类洪
警告: 为了编写权宜之计和可证明的功能执行, 已经使用了一些非平凡的编程技术。但是,这是 希望减轻对概念基础的阐述 通过尽可能简单和最低限度地展示本质 突出显示/ / / /。鼓励仔细阅读,学习和实验 避免货物编码,疏忽和犯错误。 这个答案体现在Arduino IDE ESP8266核心编码环境中。 由OP提出的算法并不完全正确(就像这个;)。 约翰逊法典 ------------------------- 由于实际格雷编码无关紧要,因此使用约翰逊计数器的格雷码非常简单 并且通过认知和计算方式计算要改变的位和下一个代码。 请注意,约翰逊计数器格雷码密度是线性的而不是对数的。 对于4字节的32位,序列可以在复位前从0到63进行计数。 有必要仔细验证后面的代码的功能适用性, 适当地修改它。 提示:验证是必须的,特别是对于“二进制反射”格雷码(BRGC)! /./ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/./ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ * 输出:
关于二元反射格雷码(BRGC)的一些背景材料 -------------------------------------------------- --------------------------------------------- 转换: --------------------- REF:Code Golf:格雷码
数数: ----------------- 以下(根据上面的参考)任意获得前面和后面的BRGC代码。 NB!
和
的顺序是奇偶校验确定的,否则不相应。 排序可能是
或者它可能是
,因此,
(奇偶校验)可以区分。
即。
于是
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /。
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /。 REF: 格雷码中的邻居
哦是的,...计算
中的位设置,它将具有类似000 ... 0111..1 Prove的位模式。 如何获得2的幂的位位置 -
参数必须设置一个位。 方法1 * /
/ * 方法2 * /
/ * 方法3 * /
/ * 方法4 * /
/ * 方法5 细节结束了。 一个明智的常量选择可以减少到只有2个操作吗? * /
/ * 测试环境 * /
/ ================================================= ===================== 警告: ----------- OP的算法无效。
编码为: * /
/ * 样本输出:
好奇? ----------- 以下代码是 非常非常粗糙的方法,可以加快寻找合适的比特包装计数候选人 计算
(在基数2即.19ѭ)。 * /
/ *
* /