C / C ++检查是否在unsigned int中设置了位31

时间:2013-05-21 06:35:15

标签: c++ c bits

我正在尝试检查并查看是否在unsigned int中设置了一个位。我不知道我怎么做到这一点,但我认为它会是这样的。我正在尝试用C ++(但是一个函数)制作cdq指令

这就是我所拥有的

unsigned int cdq(unsigned int eax)
{
     unsigned int edx = 0;

     if( (eax >> 31) & 1 ) { edx = 0xFFFFFFFF; }
     return edx
}

当我使用具有以下值的函数时:

cdq(0x12345678)位31设置为(1)所以它应该返回(unsigned int)-1 cdq(0x01)位31未设置(0)因此它应返回0

问题是它总是返回0,我不知道为什么

1 个答案:

答案 0 :(得分:6)

  

cdq(0x12345678)位31设置为(1)

不,它不是......最高位是第28位:

    1    2    3    4    5    6    7    8
 0001 0010 0011 0100 0101 0110 0111 1000
 ^  ^ 
 |  |
31  28

您的代码应该可以使用,但我会使用

if( eax & (1U << 31) ) edx = 0xFFFFFFFF;

因为它更直接并且它会移动常量而不是变量,所以在运行时更少工作(尽管优化编译器应该为两者生成相同的代码)。

其实我会写类似

的东西
int cdq(int eax)
{
    return eax < 0? -1 : 0;
}

顺便说一句,您的代码实际上并没有实现cdq,因为您的eax和edx变量不是硬件eax和edx寄存器。而且,将ASM指令复制为C函数实际上并不是一个好主意... C有自己的特性来做这些事情,例如,

int32_t foo = -0x12345678;
int64_t bar = (int64_t)foo;