【问题标题】:Clearing least significant bit清除最低有效位
【发布时间】:2014-05-20 02:05:58
【问题描述】:

问题

如何在不影响其余值的情况下将最低有效位更改为 0,例如:0xffffffff,例如在 C 或 Python 中?我不是数学天才,所以对我来说很难找到实现这一目标的方法。

解决方案

n = 0 // clear this bit
0xffffffff &= ~(1U << n) = 0xfffffffe

【问题讨论】:

标签: c bit


【解决方案1】:

试试这个清除最低有效位:

int x = 0xffffffff;

...

/* clear least significant bit */
x &= ~1;

设置 LSB

int x = 0xffffffff;

...

/* set least significant bit */
x |= 1;

更改 LSB

int x = 0xffffffff;

...

/* change least significant bit */
x ^= 1;

如果您想扩大设置/清除/更改位n,请将1 更改为(1U&lt;&lt;n)

【讨论】:

  • 谢谢。 x &amp;= ~(1U &lt;&lt; n) 是我的最佳解决方案。因为如果我使用x ^= 1U &lt;&lt; n,它只会翻转一点。我需要确保它正在清除该位。
【解决方案2】:
 unsigned x = (x>>1U)    
          x = (x<<1U)  

这很容易理解....
示例:
设 x = 10010101011

第 1 步:x = 0 1001010101 // x>>1
第二步:x = 1001010101 0 // x

比较

10010101011
10010101010

另一种方法可以是无符号 x = x &amp; 0Xfffffffe 等于 11111111111111111111111111111110 即 31 位 1 以保持位 31 为 1,因为它在 x 中发生。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    使用按位NOT 运算符~0 计算所有设置为1 的位。将此分配给 unsigned int 变量并将其左移 1 位,以便除最低有效位之外的所有位都是 1。在x 上使用按位AND 运算符&amp; 来切换最低有效位。

    unsigned int x = 0xffffffff;
    unsigned int y = 0;
    x = x & (~0 << 1);
    

    【讨论】:

      【解决方案4】:

      如果您不想深入研究位操作,只需执行i = (i / 2) * 2;。这将清除位 0(为什么?)。

      【讨论】:

      • 这正是你想知道的,没有任何想成为数学天才的尝试;)
      • 确实如此,谢谢!但是,在我看来,这比为什么其他答案有效更难理解。这不是数学上可以解释的,而是与计算机科学相关的。
      【解决方案5】:

      C 编译器可以将其转换为推荐的 (i / 2U) * 2U 无符号数解决方案,因为不需要 0xFF..FEu 逻辑 AND 常量操作数,该操作数不能直接在某些内核(例如某些 Cortex ARM)处直接编码为汇编指令或 -Os 编译器选项支持此解决方案。

      在汇编语言中,这个数学表达式只有两条指令——逻辑右移和不带进位的逻辑左移。

      不使用左右移动的二进制表示的另一种数学解释是,(i / 2U) * 2U 产生最接近的较低偶数(结果是 ii - 1U 如果 i 是奇数)。这意味着奇数元素仅从 1*2^0 的数字中删除 -> 二进制表示中的 lsb。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多