如何在不使用任何循环的情况下检查连续值
how to check consecutive value without using any loop
我需要编写一个函数来检查某些值是否连续,例如 0b0011100、0b001111111 或 0b100000000 都可以(return 不是 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), 弹出计数器(计算个数),左移和右移。
所有值都是 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) || ...
我需要编写一个函数来检查某些值是否连续,例如 0b0011100、0b001111111 或 0b100000000 都可以(return 不是 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), 弹出计数器(计算个数),左移和右移。
所有值都是 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) || ...