3

我需要一种仅使用运算符在 32 位整数(最高有效位)中查找符号位的方法!~ & ^ | +。我只能使用最大为 0xFF 的常量,但可以构造更大的数字。它必须是内联代码,没有循环或条件

是的,这是一个作业,但这不是全部问题,它只是我需要检查的一个小案例。

我知道我可以通过执行 x>>31 来获得符号,这可以使用除法来完成,但这只会导致需要更多我无法使用的位移:(

操作员越少越好,因为我只允许 10 人完成整个问题,这只是一个小案例。

这是为了检查数字 x 是否等于 0x7FFFFFFF。我的代码现在读取的方式是 [(is x neg?) & (is x+1negative)]。如果 x 等于 0x7FFFFFFF 然后加 1 将溢出缓冲区导致 x 变为负数。但是这个逻辑只有在 x 事先不是负数的情况下才有效。因此是第一部分。

请帮帮我???

4

3 回答 3

5

测试符号位很困难;对于整个问题,我认为您正在寻找类似的东西

!((~x) ^ (x + 1))

这测试~xx + 1是按位相同的,即相同的数字。

于 2012-09-25T10:43:59.940 回答
1

你可以使用工会吗?这与您的其他参数一致。小心检查处理器的字节顺序。这决定了数组索引应该是 0 还是 3。

typedef union
    {
    int integer;
    unsigned char byte[4];
    } IntSplitter;

IntSplitter a;
a.integer = ValueToBeTested + 1;
// now the value (a.byte[3]&0x80) returns 1 for neg or 0 for pos
// for example
if(a.byte[3]&0x80)
    // code if negative..

编辑:我已经说过字节序决定了索引应该是 0 还是 3。如果我弄错了,另一种方法仍然非常简单......实际上比我之前的例子容易得多。

#ifdef BIG_ENDIAN
typedef union
    {
    int integer;
    struct
        {
        unsigned IsNegative :1
        unsigned :7
        unsigned :8
        unsigned :8
        };
    }CheckNeg_t
#else
typedef union
    {
    int integer;
    struct
        {
        unsigned :8
        unsigned :8
        unsigned :7
        unsigned IsNegative :1
        };
    }CheckNeg_t
#endif

CheckNeg_t a;
a.integer = ValueToBeTested + 1;

if(a.IsNegative)
    // code if negative..
于 2012-09-25T11:30:26.933 回答
0
#include <limits.h>

negative = !!(INT_MIN & number);
于 2012-09-25T14:53:55.417 回答