kuba_444 napisał(a):float dec="-13,56";
Zapis nieprawidłowy. W cudzysłowie umieszczamy tylko łańcuchy znaków a nie liczby. Poza tym podając w
kodzie liczbę zmiennopozycyjną zawsze używamy kropki nie przecinka. Powinno być:
kuba_444 napisał(a):float u2="101101,01001";
Ten zapis również jest nieprawidłowy - cudzysłowie. Poza tym wartość binarną należałoby tutaj zapisać raczej w zmiennej typu String, a nie float. Poza tym
-13 to w zapisie dwójkowym ma chyba wartość:
1111111111111111111111111111111111111111111111111111111111110011 a nie
101101?!
kuba_444 napisał(a):Chodzi mi o to,żeby przyjmował liczby dodatnie, ujemne i przeliczał zarówno to co jest przed przecinkiem jak i po.
No cóż brak Tobie doświadczenia w programowaniu obiektowym, więc pewnie dlatego nie potrafiłeś zmodyfikować podanego kodu.
String IntToBin(int Value)
{
int p;
String bin = "";
String Result;
if(Value == 0) return "0";
for(int x = 1; x < (8 * sizeof(Value)); x++)
{
if((Value % 2) == 0)
bin = "0" + bin;
else
bin = "1" + bin;
Value = Value >> 1;
}
bin.Delete(1, (8 * bin.Pos("1") - 1) / 8);
Result = "0" + bin; //jeżeli nie chcemy 0 na początku ten fragment należy zmienić na: Result = bin;
return Result;
}
//---------------------------------------------------------------------------
String DecToU2(double Value)
{
String sd = FloatToStrF(Value, ffNumber, 7, 2); // 2 - z dokładnością d dwóch miejsc po przecinku
int xPos = sd.Pos(",");
int d1 = sd.SubString(1, xPos - 1).ToInt();
int d2 = sd.SubString(xPos + 1, sd.Length()).ToInt();
return IntToBin(d1) + "," + IntToBin(d2);
}
//---------------------------------------------------------------------------
String DecToU2(long int Value)
{
return IntToBin(Value);
}
//---------------------------------------------------------------------------
String DecToU2(int Value)
{
return IntToBin(Value);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
float decF = -13.35;
Edit1->Text = DecToU2(decF);
int decI = -13;
Edit2->Text = DecToU2(decI);
}
//---------------------------------------------------------------------------
Jak widzisz są tutaj trzy przeciążone funkcje, więc to które funkcja zostanie wywołana zależy od tego, jakie przekażesz jej wartości poprzez argumenty funkcji.
Co się tyczy konwersji w drugą stronę, to tak na szybkiego mogę zaproponować coś takiego:
int BinToInt(String Value)
{
int ValueSize, Result;
Result = 0;
ValueSize = Value.Length();
for(int i = ValueSize; i > 0; i--)
if(Value.SubString(i, 1) == "1")
Result = Result + (1 << (ValueSize - i));
return Result;
}
//---------------------------------------------------------------------------
double U2ToDec(String Value)
{
int xPos = Value.Pos(",");
if( xPos == 0 ) return BinToInt(Value);
int d1 = BinToInt( Value.SubString(1, xPos - 1) );
int d2 = BinToInt( Value.SubString(xPos + 1, Value.Length()) );
return ((String)d1 + "," + (String)d2).ToDouble();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->Text = U2ToDec( "10011,1101" );
}