2014-09-20 100 views
1

我正在尝试设置所有位的最低有效位。例如,copyLSB(6)将产生0x00000000,而copyLSB(5)将产生0xffffffffC位移不按预期工作

这里是我的代码:

int copyLSB(int x) { 
    int r = x << 31; 
    r = x >> 31; 
    return r; 
} 

该方案适用于6和5然而,当我输入0x80000000它失败并返回0xffffffff

嗨,大家好,我找到了一种不使用位移的方法,这也适用于有符号数字。

int copyLSB(int x) {                         │ 
     int result = x & 1;                       │ 
     return ~(~(x & 0) + result);                     │ 
} 
+3

请不要在符号值上进行位运算。请。 – 2014-09-20 21:19:15

+0

@LightnessRacesinOrbit这是我的任务的一部分哈哈。 – mrQWERTY 2014-09-20 21:20:06

+1

然后你的任务是教你如何让你从我的团队中被解雇的做法。 – 2014-09-20 21:20:27

回答

3

0x80000000是负数,如果您的int s为32位,并用于two's complement

负向左移是未定义的行为。消极的右移是实现定义的行为。

从标准:

6.5.7按位的移位运算符

E1 < < E2的结果是E1左移E2位位置;空位填充了 零。 ....如果E1具有带符号的类型和非负值,并且E1×2^E2可以在结果类型中表示,那么这就是结果值;否则,行为是不确定的。

....

E1的结果>> E2E1右移E2位的位置。 ...如果E1具有带符号的类型和负值,则结果值是实现定义的。