[С/C++] Перевод чисел из системы счисления Х в сс Y
Ну если очень хочеться ты не тормози, можешь попробовать. Я всегдa готова перенять опыт от профессионалов дела, а не слова. ;)
Тут на форуме integral написал задачу "биты числа" ну очень интересно посмотреть как такую задачу решит настоящий програмист а не шумеры не... .
Шумеры - это древние люди , подозреваемые в связях с инопланетянами .Занимались , очевидно , контробандай звёздных компов из за чего получили привычку вести счёт в 64ричной системе :D .
вариант с указателями вам показали ,а это вариант с peekb() - прямой доступ к байту по адресу .
void main(){
unsigned char bit;
double real=16;
for( int i=0;i<8;i++){
bit=peekb(FP_SEG((void far *)&real), FP_OFF((void far *)&real)+7-i);
for(unsigned char j=0;j<8;j++){printf("%1d", (bit>>(7-j))&0x01); };
};
}
Поздравляю с 8 марта нашу новую ученицу Оленьку.:)
void main(){
unsigned char bit;
double real=16;
for( int i=0;i<8;i++){
bit=peekb(FP_SEG((void far *)&real), FP_OFF((void far *)&real)+7-i);
for(unsigned char j=0;j<8;j++){printf("%1d", (bit>>(7-j))&0x01); };
};
}
Этот код ты случайно не из Гилгамеша выкопал?
Из за FP_SEG, FP_OFF, peekb - Visual C++/CBuilder не может откомпилировать программу. Предполагаю, что это DOS-ская прога для 16-битовых машин.
В наше время вместо
bit=peekb(FP_SEG((void far *)&real), FP_OFF((void far *)&real)+7-i);
пишут
bit=*((unsigned char *)&real+7-i);
хотя бы потому, чтоб программу можно было откомпилировать.
Нужно перевести 64-х разрядное число из двоичн. в десятичное представление средствами Borland C++ 3.1
Вот мой вариант :
/* Функция осуществляет перевод из двоичного кода
в десятичный. Число в двоичном коде задается в виде строки.
Длина двоичного числа ограничивается 64 разрядами.*/
char* Bin2Dec(char *str)
{
int len=0,i=0;
long double s=0,k=1;
char res[21];
/*Если длина числа больше 64 разрядов,
оставляем только старшие 64 разряда */
len = strlen(str);
if( len>MaxBinLen)
{
str[MaxBinLen] = 0;
len = MaxBinLen;
}
for(i=len-1;i>=0;i--)
{
if(str == '1')
s = s + k ;
k=k*2;
}
gcvt(s,21,res);
return res;
}
Это правильно работает только с числами до 59-х разрядов. А когда k достигает значения 576460752303423488 умножение на 2 даёт неверный результат. Я так понимаю это особенности работы процессора с типом double (long double), но большего типа для хранения 64-го числа в BC++ 3.1 я не нашел. Поскажите выход из этой ситуации =>
Вопрос к знатокам систем счисления :)
Нужно перевести 64-х разрядное число из двоичн. в десятичное представление средствами Borland C++ 3.1
Вот мой вариант :
/* Функция осуществляет перевод из двоичного кода
в десятичный. Число в двоичном коде задается в виде строки.
Длина двоичного числа ограничивается 64 разрядами.*/
char* Bin2Dec(char *str)
{
int len=0,i=0;
long double s=0,k=1;
char res[21];
/*Если длина числа больше 64 разрядов,
оставляем только старшие 64 разряда */
len = strlen(str);
if( len>MaxBinLen)
{
str[MaxBinLen] = 0;
len = MaxBinLen;
}
for(i=len-1;i>=0;i--)
{
if(str == '1')
s = s + k ;
k=k*2;
}
gcvt(s,21,res);
return res;
}
Это правильно работает только с числами до 59-х разрядов. А когда k достигает значения 576460752303423488 умножение на 2 даёт неверный результат. Я так понимаю это особенности работы процессора с типом double (long double), но большего типа для хранения 64-го числа в BC++ 3.1 я не нашел. Поскажите выход из этой ситуации =>
Выход из этой ситуации это использование строк.
Немогу перевести число из 4ой системы в 16ую.
Пытался сделать по примеру перевода из 2ой в 10ую.
сирано не идет.
Буду рад любой помощи.
Вот тут помозговав надумал:
#include<conio.h>
#include<math.h>
#include<string.h>
void main()
{
char m[5];
long int k=0;
int i,v,t;
printf("BBeDuTe 4-oe 4uc/lo:\n");
scanf("%s",&m);
for(v=0;v<i;v++)
{for(i=strlen(m)-1;i>=0;i--)
{t=pow(4,v);
k+=m*t-48;
}
}
printf("%i",k);
getch();
}
это пока в десятичную
дальше не идет..
[COLOR=red]читай правила форума Студентам[/COLOR]
Немогу перевести число из 4ой системы в 16ую.
Пытался сделать по примеру перевода из 2ой в 10ую.
сирано не идет.
Буду рад любой помощи.
Вот тут помозговав надумал:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>
void main()
{
char m[5];
long int k=0;
int i,v,t;
printf("BBeDuTe 4-oe 4uc/lo:\n");
scanf("%s",&m);
for(v=0;v<i;v++)
{for(i=strlen(m)-1;i>=0;i--)
{t=pow(4,v);
k+=m*t-48;
}
}
printf("%i",k);
getch();
}
это пока в десятичную
дальше не идет..
Ну я могу только сказать, что число из 4-й сс в 16 сс можно получить последовательным делением числа в 4-й сс на 16 и результат записать в обратном порядке, учитывая, что числа болше 9 это знаки. Вообщем элементарщина. :-)
int digit4ss=.....;
char digit16ss[5]="";
while(digit4ss>16)
digit16ss=digit4ss/16
Вообщем набросок понятен. Там типа в символ перведодиш, если символ больше десить то символы а, б, с... Короче дерзай.:)
Я только начинаю писать на с++,по этому не могу справится с этой задачей.ПОМОГИТЕ!
[COLOR="Red"]Замечание: название темы должно отражать суть вопроса и быть более лаконичным.[/COLOR] OlgaKr.
пример
char s[256];
int i;
sscanf(s, "%d", &i); считавает из строки целое десятичное число
эта функция может считовать числа 16-ричной и двоичной системах исчисления
смотри в хелпах
Заглянул сюда, не всё понял в коде. К тому же программа отказывается компилироваться, ссылаясь на неизвестную <vcl.h> в MVS 6. Можно как-нибудь попроще, без "byte", vcl и параметров командной строки функции main ? Так же непонятен смысл существования "#pragma hdrstop" и "#pragma argsused".
задавай конкретные вопросы, что не понял
Можешь все это спокойно убрать, только с byte не поняла, это ты о чем? фрагмент кода приведи.
Undefinded simvol "byte"
Undefinded simvol j
Statement missing ;
Буду вам очень благодарен!С уважением Петр.:)
P.S. Я не пойму - вы специально, что ли, так уродуете предложение, что его с первого раза прочитать невозможно?