【问题标题】:how to check consecutive value without using any loop如何在不使用任何循环的情况下检查连续值
【发布时间】:2017-08-03 17:34:32
【问题描述】:

我需要编写一个函数来检查某个值是否连续,例如 0b0011100、0b001111111 或 0b100000000 是可以的(返回不是 0),但 0b00110010 和 0b001010 不是(所有的都应该是连续的)。

但这是我需要做的没有任何循环的问题。

我正在使用一些不允许使用循环的疯狂 API,我只有以下算术函数:

+、-、*、|、||、&、&&、~、!、TZC、POPCNT、>

分别是:

加、减、乘、按位或、逻辑或、按位与、逻辑与、按位非、逻辑非、尾随零计数器(计数从 LSB 到前 1 的零)、弹出计数器(计数个),左移和右移。

所有值都是 64 位长度。

【问题讨论】:

  • 这是什么“疯狂的 API”?乍一看,这看起来像是家庭作业。
  • 到目前为止你尝试过什么?与我们分享您的想法。
  • 我投票决定将此问题作为离题结束,因为提问者没有任何努力解决问题的迹象。
  • 您是否阅读过大量有关位旋转、位黑客、位技巧的页面?
  • 如果不允许使用循环,请尝试递归 ????

标签: algorithm math 64-bit arithmetic-expressions


【解决方案1】:
!(n >> (POPCNT(n) + TZC(n)))

如果您计算 1 和尾随 0 的数量并按该数量进行移位,那么如果这些 1 是连续的,则结果仅为 0(因为只有这样所有设置的位才会被移位擦除)。

a >> b 与 a / 2^b 或 a / (1 << b) 相同。

不换班:

!(POPCNT(n + 0b1) - 1) || !(POPCNT(n + 0b10) - 1) || !(POPCNT(n + 0b100) - 1) || ... 

【讨论】:

  • 该操作>>,右移,以及您的类似操作^ 求幂和<< 左移,不在允许的操作列表中。
  • 我认为它必须存在,否则解决方案将很难看。例如。您可以执行& 0xFFFFFFFFFFFFFFF8 并删除!,而不是右移3。如果有 if,你可以这样做 64 次。
  • 很抱歉 SHL 实际上是受支持的。我编辑了这个问题...@maraca 非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2016-10-20
  • 2021-06-08
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多