Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] вопрос по переводу между системами счисления 
:(
    Опции темы
Jolia
Дата 13.2.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



Здрасте еще раз) я опять по поводу перевода из десятичной системы в двоичную. В общем нужно реализовать этот перевод для всех целых типов char, integer, long и  unsigned long в одной программе. Код написан. Только есть проблема. Допустим я перевожу:
    (-12) в двоичную
получается: 11111111111111111111111111110100
теперь обратно перевожу  11111111111111111111111111110100 в десятичную
получается: 4294967284.
  так и должно быть? или у меня ошибка в коде и надо чего-нибудь добавить?

вот код:

Код

#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>




void main(void)
{  clrscr();
  int z;
  cout<<"„«п ЇҐаҐў®¤  Ё§ ¤ҐбпвЁз­®© бЁбвҐ¬л ў ¤ў®Ёз­го ­ ¦¬ЁвҐ -  1"<<endl;
  cout<<"„«п ЇҐаҐў®¤  Ё§ ¤ў®Ёз­®© бЁбвҐ¬л ў ¤ҐбпвЁз­го ­ ¦¬ЁвҐ -  2"<<endl;
  cout<<"‚л ўлЎЁа ҐвҐ ¤Ґ©бвўЁҐ ь ";
  cin>>z;
  switch(z)

 { case 1: { char *end;
         char str[32];
         int k;
         char str2[15];

         for (int i = 0; i <= 31; ++i)
        str[i] = '0';
         cout << "‚ўҐ¤ЁвҐ зЁб«®: ";
         cin >> str2;
         if (str2[0]=='-')
         {
           long int bb=strtol(str2,&end,10);
           k=31;
        while (bb != 0)
         {
           if ((bb % 2) != 0)
            str[k] = '1';
           --k;
           bb = bb / 2;
         }

        for ( k=0;k<=31;k++)
         {
           if (str[k]!='1')
            str[k]='1';
           else
            str[k]='0';
         };

        for (i=31;i>=0;i--)
         {
           if (str[i]=='1')
            str[i]='0';
           else
             {str[i]='1';
              break;}
         }

           }
      else
           { unsigned long int bb=strtoul(str2,&end,10);
         k=31;
         while (bb != 0)
           {
             if ((bb % 2) != 0)
             str[k] = '1';
             --k;
             bb = bb / 2;
           }
           };
   cout << "—Ёб«® ў ¤ў®Ёз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: " << endl;
   for (i=0;i<=31;i++)
   cout<<str[i];
   cout<<endl;
   break; };

   case 2:{char str3[32];
       char str[32];
       long   tmp = 0;
       unsigned long int ptr=0;
       int tt=0;
       for (int i = 0; i <= 31; ++i)
           str[i] = '0';
       cout<<"‚ўҐ¤ЁвҐ зЁб«® ў ¤ў®Ёз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп (¬ ЄбЁ¬г¬ 32 бЁ¬ў®« ): "<<endl;;
       cin>>str3;
       int k=0;
       for(i=31,k=strlen(str3)-1;i>=0;i--,k--)
          {str[i]=str3[k];
           if (k==0)
           break;}


     for ( i = 31, k = 0; i >= 0; i--, k++)
        {if ((tmp + (str[i] - '0') * pow(2,k))>2147483647)
         { ptr= tmp + (str[i] - '0') * pow(2,k);
           tt=1;}
        else
         {tmp = tmp + (str[i] - '0') * pow(2,k);
          tt=2;};

     };
     cout << "‚ ¤ҐбпвЁз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: ";
     if (tt==1)
       cout << ptr;
     else
       cout<<tmp;



          break;


  };
   default:cout<<"ЋиЁЎЄ !";}
   getchar();


}


может быть стоит на 8 байт сделать - 64 символа???
надеюсь на вас, заранее спасибо!!!
PM MAIL   Вверх
susanin
Дата 13.2.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 587
Регистрация: 7.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 7



ну если как пример брать калькулятор в windows то там такая же история...так что все нормально...наверно... smile 
PM MAIL   Вверх
Jolia
Дата 13.2.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



понадеемся что прокатит)))но если чтооо...я вас поспрашаю на эту тему))))) если можно...
PM MAIL   Вверх
Optimus
Дата 13.2.2008, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 1.9.2007

Репутация: 9
Всего: 14



я передел программу из этой темы,
теперь она работает и для отрицательных чисел
Код

#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

void main(void)
{
  long a = 0;
  long bb = 0;
  const int N = 65;
  char str[N];
  int i = 0;
  int k;
  int tmp = 0;
  char bit = '0';

  clrscr();
  cout << "‚ўҐ¤ЁвҐ зЁб«®: ";
  cin >> a;

  if (a < 0)
  {
    str[0] = '1'; // pervii simvol eto znak v nomere
    a *= -1;
    a -= 1;
    bit = '1';
  }

  for ( i = 0; i < N - 1; ++i)
  {
    str[i] = bit;
  }

  str[N - 1] = '\0'; //  simvol konta stroki

  bb = a;
  i = 0;

  bit = (str[0] == '1') ? '0' : '1';

  while (bb != 0)
  {
    if ((abs(bb) % 2) != 0)
      str[N - 2 - i] = bit; // zapisovaem s konta

    ++i;
    bb = abs(bb) / 2;
  }

   cout << "—Ёб«® ў ¤ў®Ёз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: " << endl;
   cout << str << endl;
   getchar();

   tmp = 0;

   if (str[0] == '1')
     tmp -= 1;

   bit = (str[i] == '1') ? '1' : '0';

   for ( i = N - 2, k = 0; i > 0; i--, k++)
   {
     tmp = tmp + (str[i] - bit) * pow(2,k);
   }


   cout << "‚ ¤ҐбпвЁз­®© бЁб⥬Ґ бзЁб«Ґ­Ёп: " << tmp;
   getchar();

}


Это сообщение отредактировал(а) Optimus - 14.2.2008, 01:41
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
dizzy1984
Дата 14.2.2008, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Jolia @  13.2.2008,  23:48 Найти цитируемый пост)
так и должно быть?

Обычно со знаком не заморачиваются, но подумай сама : как ты из отрицательного числа в одной системе можешь получить положительное в другой? Пример - отрицательное число описывает отсутствие денег, положительное - их наличие. Записывая отсутствие 12-ти рублей и переводя их в систему счисления с основой 2, ты получаешь их наличие. Смешно? Смешно.
Если программа должна поддерживать работу и с отрицательными числами, то бери модуль и работай с ним. Потом добавляй правильный знак. В твоем случае правильное представление -12 это -1100.
4294967284 и -12 это одно и то же, в зависимости от того, как посмотреть. Тип long int (4 байта в ms dos) дает 2^32 вариантов и соответственно целое число в диапазоне [0 ; 2^32 - 1], либо [-2^32 / 2 -1 ; 2^32/2] (можно и еще придумать). Эти 2 варианта сооветствуют signed/unsigned. То есть 
Код

signed long a = -12; //любая функция вывода покажет -12
unsigned long b = (unsigned long)a; //любая функция вывода покажет 4294967284

PM MAIL   Вверх
Jolia
Дата 14.2.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



ох уж этот перевод...скоро сниться будет... всем ВОООООООТ ТАКООООООЕ ОГРОООООМНОЕ СПАСИБО за то что проконсультировали и помогли!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.