二进制-十进制负位集

Binary-Decimal Negative bit set

本文关键字:十进制 二进制      更新时间:2023-10-16

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

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

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

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

或者直接与0比较。

bool Negative = (value < 0);

你为什么不把它和0比较一下呢?应该可以很好地工作,而且几乎可以肯定,您无法以比编译器更有效的方式做到这一点。

我完全不清楚这是否是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 ==> %dn",num, res);
    // do it again for an 8 bit positive value
    //  this time with just direct casts.
    num = 0x70;
    printf("%d ==> %dn", num, (int)((signed char)(num & 0xFF)));
    return 0;
}

245 ==> -11
112 ==> 112

那是你想做的吗?简而言之,上面的代码将获取num底部的8位,将它们视为带符号的8位值,然后将它们提升为带符号的本机int。结果是,现在您不仅可以"知道"8位是否是负数(因为如果它们是负数,res将是负数),您还可以在此过程中获得8位带符号数作为本机int

另一方面,如果你关心的是输入int中的第8位是否设置,并且应该表示负值状态,那么为什么不直接:
int IsEightBitNegative(int val)
{
    return (val & 0x80) != 0;
}