我需要编写一个函数来检查某些值是否连续,例如 0b0011100、0b001111111 或 0b100000000 都可以(不返回 0)但 0b00110010 和 0b001010 不是(所有这些都应该是连续的)。
但这是我需要在没有任何循环的情况下完成的捕获。
我正在使用一些不允许使用循环的疯狂 API,我只有以下算术函数:
+, -, *, |, ||, &, &&, ~, !, TZC, POPCNT, <<, >>
它们是:
plus, minus, mult, bitwise or, logical or, bitwise and, logical and, bitwise not, logical not, trailing zero counter (count the zeros from the LSB to first 1), pop-counter (计算的个数一个),左移和右移。
所有值都是 64 位长度。
最佳答案
!(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) || ...
关于algorithm - 如何在不使用任何循环的情况下检查连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768091/