0

如何判断二进制数是否为负?

目前我有下面的代码。它可以很好地转换为二进制。转换为十进制时,我需要知道最左边的位是否为 1 以判断它是否为负数,但我似乎不知道该怎么做。

另外,我怎样才能让它返回一个整数,而不是让我的 Bin2 函数打印 1 和 0?我不想将它存储在字符串中,然后转换为 int。

编辑:我使用的是 8 位数字。

int Bin2(int value, int Padding = 8)
{
    for (int I = Padding; I > 0; --I)
    {
        if (value & (1 << (I - 1)))
            std::cout<< '1';
        else
            std::cout<<'0';
    }

    return 0;
}

int Dec2(int Value)
{
    //bool Negative = (Value & 10000000);

    int Dec = 0;
    for (int I = 0; Value > 0; ++I)
    {
        if(Value % 10 == 1)
        {
            Dec += (1 << I);
        }
        Value /= 10;
    }

    //if (Negative) (Dec -= (1 << 8));

    return Dec;
}

int main()
{
    Bin2(25);
    std::cout<<"\n\n";
    std::cout<<Dec2(11001);
}
4

3 回答 3

2

我完全不清楚这是否是 OP 正在寻找的,但值得一试:

如果您知道有符号int中的值应该表示有符号的 8 位值,则可以将其拆开,将其存储在有符号的 8 位值中,然后将其提升回int像这样的本机有符号值:

#include <stdio.h>

int main(void)
{
    // signed integer, value is 245. 8bit signed value is (-11)
    int num = 0xF5;

    // pull out the low 8 bits, storing them in a signed char.
    signed char ch = (signed char)(num & 0xFF);

    // now let the signed char promote to a signed int.
    int res = ch;

    // finally print both.
    printf("%d ==> %d\n",num, res);

    // do it again for an 8 bit positive value
    //  this time with just direct casts.
    num = 0x70;
    printf("%d ==> %d\n", num, (int)((signed char)(num & 0xFF)));
    return 0;
}

输出

245 ==> -11
112 ==> 112

是你想要做的吗?简而言之,上面的代码将把位于底部的num8 位,将它们视为有符号的 8 位值,然后将它们提升为有符号的 native int。结果是您现在不仅可以“知道” 8 位是否为负数(因为如果是负数,则 res 将为负数),您还可以int在此过程中将 8 位有符号数作为本机。

另一方面,如果您关心的只是第 8 位是否在 input 中设置int,并且应该表示负值状态,那么为什么不只是:

int IsEightBitNegative(int val)
{
    return (val & 0x80) != 0;
}
于 2012-12-31T10:50:18.200 回答
2

您正在错误地检查负值。请改为执行以下操作:

bool Negative = (value & 0x80000000); //It will work for 32-bit platforms only

或者可能只是将它与 0 进行比较。

bool Negative = (value < 0);
于 2012-12-31T09:58:46.333 回答
2

为什么不直接比较一下0。应该可以正常工作,几乎可以肯定你不能以比编译器更有效的方式来做到这一点。

于 2012-12-31T09:59:28.860 回答