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