按位取反直到第一个正位

Bitwise negation up to the first positive bit

我在一个项目中工作,我不能使用 U32 位(无符号 32 位)的按位取反,因为当我尝试使用取反运算符时,例如我有 1 和取反(根据这个函数)是 U32 可能的最大数字,我预计是零。我的想法是使用像 (110010) 这样的二进制数,我只需要取反第一个 1 位 (001101) 之后的位。在 LabVIEW 中有办法做到这一点吗?

这会计算出您要查找的值。

  • 1110 --> 0001(又名 1)
  • 1010 --> 0101(又名 101)
  • 111 --> 000(又名,0)[事实上,所有全为“1”的模式都将变为 0]
  • 0 --> 0 [因为没有要取反的位...也许您想将其作为“1”的特殊情况?)

注意:这是一个 VI 代码段。将 .png 文件保存到您的磁盘,然后将图像从 OS 拖到 LabVIEW 中,它将生成框图(我在 LV 2016 中编写它,因此适用于 2016 年或更高版本)。有时直接从浏览器拖动到图表是可行的,但大多数浏览器似乎会删除使其有效的 EXIF 数据。

这是一个没有循环的替代解决方案。它将输入格式化为它的字符串表示形式(没有前导零)以计算出要取反的位数 - 称之为 n - 然后将输入与 2^n - 1.

进行异或运算

请注意,此版本将 return 输出 1,输入 0

使用字符串函数感觉有点老套...但它不使用循环!!

显然我们可以尝试使用其 base-2 日志获取输入的 'bit length',但我还没有坐下来研究如何正确确保在输入仅设置了最高有效位,因此以 2 为底的对数应该正好是一个整数,但结果可能会小一些。

这是一个没有 strings/loops 的解决方案,使用转换为浮点数(计算 floor(log_2(x)) 的常用方法)。这不适用于无符号类型。