二进制 - 十进制负位集

时间:2012-12-31 09:54:17

标签: c++ binary decimal

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

目前我有以下代码。它可以很好地转换为二进制。转换为十进制时,我需要知道最左边的位是否为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);
}

3 个答案:

答案 0 :(得分:2)

您正在错误地检查负值。请改为:

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

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

bool Negative = (value < 0);

答案 1 :(得分:2)

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

答案 2 :(得分: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

你想要做什么?简而言之,上面的代码将8位置于num的底部,将它们视为带符号的8位值,然后将它们提升为已签名的本机int。结果是你现在不仅可以“知道”8位是否为负数(因为如果它们是res将为负数),你还可以获得8位有符号数作为本地int。过程

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

int IsEightBitNegative(int val)
{
    return (val & 0x80) != 0;
}