【发布时间】:2014-05-20 02:05:58
【问题描述】:
问题
如何在不影响其余值的情况下将最低有效位更改为 0,例如:0xffffffff,例如在 C 或 Python 中?我不是数学天才,所以对我来说很难找到实现这一目标的方法。
解决方案
n = 0 // clear this bit
0xffffffff &= ~(1U << n) = 0xfffffffe
【问题讨论】:
-
This answer 会帮助你
如何在不影响其余值的情况下将最低有效位更改为 0,例如:0xffffffff,例如在 C 或 Python 中?我不是数学天才,所以对我来说很难找到实现这一目标的方法。
n = 0 // clear this bit
0xffffffff &= ~(1U << n) = 0xfffffffe
【问题讨论】:
试试这个清除最低有效位:
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<<n)。
【讨论】:
x &= ~(1U << n) 是我的最佳解决方案。因为如果我使用x ^= 1U << n,它只会翻转一点。我需要确保它正在清除该位。
unsigned x = (x>>1U)
x = (x<<1U)
这很容易理解....
示例:
设 x = 10010101011
第 1 步:x = 0 1001010101 // x>>1
第二步:x = 1001010101 0 // x
比较:
10010101011
10010101010
另一种方法可以是无符号 x = x & 0Xfffffffe 等于 11111111111111111111111111111110 即 31 位 1 以保持位 31 为 1,因为它在 x 中发生。
希望这会有所帮助!
【讨论】:
使用按位NOT 运算符~0 计算所有设置为1 的位。将此分配给 unsigned int 变量并将其左移 1 位,以便除最低有效位之外的所有位都是 1。在x 上使用按位AND 运算符& 来切换最低有效位。
unsigned int x = 0xffffffff;
unsigned int y = 0;
x = x & (~0 << 1);
【讨论】:
如果您不想深入研究位操作,只需执行i = (i / 2) * 2;。这将清除位 0(为什么?)。
【讨论】:
C 编译器可以将其转换为推荐的 (i / 2U) * 2U 无符号数解决方案,因为不需要 0xFF..FEu 逻辑 AND 常量操作数,该操作数不能直接在某些内核(例如某些 Cortex ARM)处直接编码为汇编指令或 -Os 编译器选项支持此解决方案。
在汇编语言中,这个数学表达式只有两条指令——逻辑右移和不带进位的逻辑左移。
不使用左右移动的二进制表示的另一种数学解释是,(i / 2U) * 2U 产生最接近的较低偶数(结果是 i 或 i - 1U 如果 i 是奇数)。这意味着奇数元素仅从 1*2^0 的数字中删除 -> 二进制表示中的 lsb。
【讨论】: