如何在不使用任何循环的情况下检查连续值

时间:2017-03-13 15:58:45

标签: algorithm math 64-bit arithmetic-expressions

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

但这是我需要做的事情,没有任何循环。

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

+, - ,*,|,||,&,&&,〜,!,TZC,POPCNT,<<,>>

这是:

加,减,多,按位或,逻辑或,按位和,逻辑和,按位不,逻辑不,尾随零计数器(从LSB到第一个计数零),pop-counter(计数数量)其中),左移和右移。

所有值都是64位长度。

1 个答案:

答案 0 :(得分:1)

!(n >> (POPCNT(n) + TZC(n)))

如果你计算一个1和尾随零的数量并按这个数量移动那么结果只有0,如果这些是连续的(因为只有那时所有的设置位都被移位擦除)。

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

没有转变:

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