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

标签 algorithm math 64-bit arithmetic-expressions

我需要编写一个函数来检查某些值是否连续,例如 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 >> ba / 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/

相关文章:

algorithm - m 对角 NxN 对称矩阵行列式的高效算法

java - 将double转换为不带小数位的String的最佳方法

c - x86_64 ASM - 指令的最大字节数?

c++ - 异常在 MSVC 中的析构函数中抛出异常

c++ - uint32_t 值对的交换哈希函数

php - 在 MySQL 中为用户排名列表找到最佳匹配

algorithm - 如何找到对元素列表进行分组所需的最少组数?

java - 在 Java 和 C 中,负数 Mod 给出负结果

ios - 如何知道您的 .ipa 是否为 64 位

java - 如何随机排列没有相邻相等元素的字符串