我需要编写一个函数来检查某个值是否连续,例如0b0011100,0b001111111或0b100000000都可以(不返回0)但0b00110010和0b001010不是(所有这些都应该是连续的)。
但这是我需要做的事情,没有任何循环。
我使用了一些不允许使用循环的疯狂API,我只有以下算术函数:
+, - ,*,|,||,&,&&,〜,!,TZC,POPCNT,<<,>>
这是:
加,减,多,按位或,逻辑或,按位和,逻辑和,按位不,逻辑不,尾随零计数器(从LSB到第一个计数零),pop-counter(计数数量)其中),左移和右移。
所有值都是64位长度。
答案 0 :(得分:1)
!(n >> (POPCNT(n) + TZC(n)))
如果你计算一个1和尾随零的数量并按这个数量移动那么结果只有0,如果这些是连续的(因为只有那时所有的设置位都被移位擦除)。
a >> b
与a / 2^b
或a / (1 << b)
相同。
没有转变:
!(POPCNT(n + 0b1) - 1) || !(POPCNT(n + 0b10) - 1) || !(POPCNT(n + 0b100) - 1) || ...