如何在 int 中找到最低有效位 (LSB) 的位置? C++

Posted

技术标签:

【中文标题】如何在 int 中找到最低有效位 (LSB) 的位置? C++【英文标题】:How to find a position of Least Significant Bit (LSB) in an int? c++ 【发布时间】:2020-01-16 15:33:27 【问题描述】:

我必须编写一个 c++ 函数来交换 int 的第 n 位和最低有效位。我找到了一些例子并这样做了:

v1 = v1 ^ ((((v1&1) ^ (v1>>n)&1) << LSBpos) | (((v1&1) ^ (v1>>n)&1) << n));
cout<<v1;

v1 是一个整数。 v1&1 是 LSB 的值。 LSBpos 应该是 LSB 的位置,但是我不知道怎么弄。有关于如何获得设置或清除的 LSB 位置的说明,但我只需要该位置,无论是否设置。

【问题讨论】:

最低有效位是 C++ 中的第 0 位。你的意思是最少设置位吗? 【参考方案1】:

您不需要知道 LSB 的位置。这很棒,因为 endianness 它可能在多个地方!

让我们寻求帮助:How do you set, clear, and toggle a single bit?:

检查一下

你没有要求这个,但我不妨添加它。 要检查一下,请将数字 n 向右移动,然后按位与它:

bit = (number >> n) & 1U;

将第 n 位更改为 x

在 2 的补码 C++ 实现中,将第 n 位设置为 1 或 0 可以通过以下方式实现:

number ^= (-x ^ number) & (1UL << n);

去吧!

int swap_nth_and_lsb(int x, int n)

    // let to the reader: check the validity of n

    // read LSB and nth bit
    int const lsb_value = x& 1U;
    int const nth_value = (x>> n) & 1U;

    // swap
    x ^= (-lsb_value) & (1UL << n);
    x ^= /* let to the reader: set the lsb to nth_value */

    return x;


在评论中,OP 说“我必须写一行代码才能得到结果”。好吧,如果单行条件成立,你可以从上面的解决方案开始,一步一步变成单行。

【讨论】:

以上是关于如何在 int 中找到最低有效位 (LSB) 的位置? C++的主要内容,如果未能解决你的问题,请参考以下文章

在 C/C++ 中检查最低有效位 (LSB) 和最高有效位 (MSB) 的值

LSB最低有效位隐写入门

如何在Scala中替换缓冲图像中的最低有效位

在 C++ 中将最低有效位从 int 复制到 long

在C中找到整数中最高设置位(msb)的最快/最有效方法是啥?

在C中找到整数中最高设置位(msb)的最快/最有效方法是啥?