Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.82
programist alenka
0 / 0 / 0
Регистрация: 18.03.2009
Сообщений: 22
#1

Перевод целого десятичного числа в двоичною систему числения - C++

28.03.2009, 16:04. Просмотров 2805. Ответов 11
Метки нет (Все метки)

составит програму перевода целого десятичног числа в двоичною систему числения
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2009, 16:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод целого десятичного числа в двоичною систему числения (C++):

Перевод целого десятичного числа в двоичную систему счисления - C++
Перерыл инет, форум нашел кучу разных вариантов и не одного закончено го :( может у кого есть нормальный вариант реализации кода?

Перевод целого десятичного числа в шестнадцатеричную систему счисления - C++
составить програму перевода целого десятичного числа в шестнадцятеричную систему числения

Перевод отрицательного целого десятичного числа в двоичное - C++
Перевод отрицательного целого десятичного числа в двоичное

Перевод отрицательного целого десятичного числа в двоичное - C++
Помогите решить эту задачу

Перевод целого десятичного числа в строку и обратно в десятичное число - C++
перевод целого десятичного числа в строку и обратно в десятичное число, результат вывести в 3 столбика и 20 строк. заранее спасибо)

Перевод десятичного вещественного числа в новую систему счисления - C++
Перевод десятичного вещественного числа в новую систему счисления. Само число и основание новой системы счисления должны вводится со...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
28.03.2009, 16:13 #2
Что не получается?
0
kolyanb
0 / 0 / 0
Регистрация: 27.03.2009
Сообщений: 3
29.03.2009, 00:02 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include <Math.h>
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
   int n, st = 0;
   cout<<"Vvedite chislo v 10 sisteme schisleniy "; cin>>n;
   while (n > pow(2, st))
    ++st;
   --st;
   for (int i = st; i >= 0; --i)
   {
    if (n >= pow(2, i))
      {
            cout<<1;
         n = n - pow(2, i);
      }
      else
        cout<<0;
   }
    getch();
    return 0;
}
//---------------------------------------------------------------------------
0
Yevgenijz
11 / 11 / 1
Регистрация: 31.03.2009
Сообщений: 69
31.03.2009, 16:43 #4
Цитата Сообщение от programist alenka Посмотреть сообщение
составит програму перевода целого десятичног числа в двоичною систему числения
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int main()
{
 const int kol_vo_bitov=sizeof(int)*8;
 char bin[kol_vo_bitov];
 register char *ptr=bin;// далее заполним массив двоичных цифр
 *ptr++ =' ';//первый символ пробел
 int chislo;
 int i;
 i=kol_vo_bitov-1;
 do{
  *ptr++ = '0';
 }while(--i); // заполняем строку кодом нуля
 printf("Vvedite chislo");
 scanf("%d",&chislo);
 if(chislo<0){
  bin[0]='-'; // код минуса
  chislo= 
  -chislo; // чтобы не получилось "отнять" =-
 }
 i=kol_vo_bitov-1;
 do{
  *--ptr +=((char)chislo)&1; // младший бит
  chislo>>=1; // сдвигаем число вправо на 1 бит
 }while(--i);
 // теперь готова строка bin
 //вывод строки
 i=kol_vo_bitov;
 ptr=bin;
 do{
  putchar(*ptr++);
 }while(--i); 
}
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
31.03.2009, 17:22 #5
Цитата Сообщение от programist alenka Посмотреть сообщение
составит програму перевода целого десятичног числа в двоичною систему числения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
void DecToBin(int value)
{
  int mask = 0x8000;
  ~mask;
  for(int i=0;i<16;i++)
  {
    if(mask&value)
      cout << "1";
    else
      cout << "0";
    mask >>=1;
  }
  cout << endl;
}
 
int main(void)
{
  DecToBin(255);
  return 0;
}
0
Yevgenijz
11 / 11 / 1
Регистрация: 31.03.2009
Сообщений: 69
02.04.2009, 07:36 #6
Цитата Сообщение от BornLeader Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
void DecToBin(int value)
{
  int mask = 0x8000;
  ~mask;
  for(int i=0;i<16;i++)
  {
    if(mask&value)
      cout << "1";
    else
      cout << "0";
    mask >>=1;
  }
  cout << endl;
}
 
int main(void)
{
  DecToBin(255);
  return 0;
}
Неправильно!
Потому что основано на неверном предположении, что тип int имеет 16 разрядов.
На самом деле это было в 16разрядной DOS, но в 32разрядных операционных системах int имеет 32разряда, а в 64разрядных 64 разряда. Это сделано специально для лучшей переносимости программ, написанных на С/C++ .
Следовало использовать sizeof(int), чтобы не быть привязанным к размерности int.
Для 16иразрядного числа есть термине short int, но это опять же не гарантируется.
Можно только построить цепочку без указания конкретной разрядности типа.
char<=short int<=int<=long int
P.S.
И пожалуйста, избавляйтесь от дурной паскалевской привычки записывать текст подпрограммы над текстом основной программы, читать такое неприятно. Текст подпрограммы должен находиться под текстом вызывающей, а не наоборот.(Это требование стиля, а не приказ, но все же не следует писать на C по-паскалевски-- это дурной тон)
Добавлено через 2 минуты 11 секунд
здесь усовершенствовал свою программу
обнаружил ошибку в своей программе и исправил
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int main()
{
 const int kol_vo_bitov=sizeof(int)*8;
 char bin[kol_vo_bitov+1];
 register char *ptr=bin;// далее заполним массив двоичных цифр
 *ptr++ =' ';//первый символ пробел(если положительное)
 int chislo;
 int i;
 i=kol_vo_bitov;
 do{
  *ptr++ = '0';
 }while(--i); // заполняем строку кодом нуля
 printf("Vvedite chislo");
 scanf("%d",&chislo.i);
 if(chislo<0){
  bin[0]='-'; // код минуса
  chislo= 
  -chislo; // чтобы не получилось "отнять" =-
  if(chislo<0){ // единственный случай -2^kol_vo_bitov
   chislo=0;
   bin[1]='1';}
 }
 //i=kol_vo_bitov-1; эта строка не нужна
 do{
  *--ptr +=((char)chislo)&1; // младший бит
  chislo>>=1; // сдвигаем число вправо на 1 бит
 }while(chislo); // здесь изменение: если chislo=0, то остальные символы все равно 
                     //заполнятся символами нуля
 // теперь готова строка bin
 //вывод строки
 i=kol_vo_bitov+1;
 ptr=bin;
 do{
  putchar(*ptr++);
 }while(--i);
putchar('\n');
getch();
}
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
02.04.2009, 14:33 #7
Хорошо Yevgenijz, прошлый пример был сделан мною на коленке. Ну а вот если так что скажешь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
 
void PrintBin(int n);
 
int main(int argc, char* argv[])
{
    for (int i = 0; i < 16; i++)
        PrintBin(i);
   return 0;
}
 
void PrintBin(int n)
{
  unsigned int mask = 0;
  mask = ~mask;
  mask >>= 1;
  mask = ~mask;
  for (size_t i = sizeof(int)*8; i > 0; i--)
  {
    if(mask & n)
      cout << "1";
    else
      cout << "0";
    mask >>= 1;
    if(!((i-1)%8)) cout << " ";
  }
  cout << endl;
}
Добавлено через 1 минуту 53 секунды
Прошу заметить работает как часы.
1
Yevgenijz
11 / 11 / 1
Регистрация: 31.03.2009
Сообщений: 69
02.04.2009, 15:02 #8
Цитата Сообщение от BornLeader Посмотреть сообщение
Хорошо Yevgenijz, прошлый пример был сделан мною на коленке. Ну а вот если так что скажешь:
C++
1
2
    for (int i = 0; i < 16; i++)
        PrintBin(i);
Добавлено через 1 минуту 53 секунды
Прошу заметить работает как часы.
Значит работает на 15битных значениях, а если будут 31битные, будет косяк.

напр для 4000000000(четыре миллиарда)


Добавлено через 10 минут 54 секунды
Вообще-то сейчас уже прогресс в части оформления программы.
Но ты её проверил для значений от 0 до 15 и говоришь, как часы, а вдруг на 16 облом будет?
Непонятно, чего ты хочешь добиться, когда сдвигаешь и переворачиваешь mask?
и для чего используешь остаток от деления на 8?

Добавлено через 9 минут 31 секунду
разве нельзя было написать не
C++
1
mask=0; mask= ~mask;
, а просто
C++
1
mask=~0;
0
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
02.04.2009, 15:08 #9
Yevgenijz, знак минуса перед двоичной записью,это сурово.

Цитата Сообщение от Yevgenijz Посмотреть сообщение
Непонятно, чего ты хочешь добиться, когда сдвигаешь и переворачиваешь mask?
установить старший бит в единицу,остальные биты в ноль.

Цитата Сообщение от Yevgenijz Посмотреть сообщение
и для чего используешь остаток от деления на 8?
при выводе разделить блоки по 8 знаков пробелом.
1
Yevgenijz
11 / 11 / 1
Регистрация: 31.03.2009
Сообщений: 69
02.04.2009, 15:39 #10
Цитата Сообщение от Humanitis Посмотреть сообщение
Yevgenijz, знак минуса перед двоичной записью,это сурово.
Просто двоичную unsigned вывести гораздо легче, чем со знаком. Сначала не учел случай, когда число = - 2^разрядность int, т.е. тогда получится, что мы меняем знак этого числа, а оно не меняется!И не ноль, а отрицательное!
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
02.04.2009, 15:59 #11
Цитата Сообщение от Yevgenijz Посмотреть сообщение
Цитата: Сообщение от BornLeader Посмотреть сообщение Хорошо Yevgenijz, прошлый пример был сделан мною на коленке. Ну а вот если так что скажешь: Код C++ 1 2 3 4 for (int i = 0; i < 16; i++) PrintBin(i); Добавлено через 1 минуту 53 секунды Прошу заметить работает как часы. Значит работает на 15битных значениях, а если будут 31битные, будет косяк.
Ты внимательно посмотри что это тело функции main. А свою функцию PrintBin я до этого тестировал на большем количестве чисел. И еще раз на помню
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void PrintBin(int n)
{
  unsigned int mask = 0;
  mask = ~mask;
  mask >>= 1;
  mask = ~mask;
  for (size_t i = sizeof(int)*8; i > 0; i--) // вот здесь посмотри внимательно
  {
    if(mask & n)
      cout << "1";
    else
      cout << "0";
    mask >>= 1;
    if(!((i-1)%8)) cout << " ";
  }
  cout << endl;
}
Добавлено через 5 минут 59 секунд
Цитата Сообщение от Yevgenijz Посмотреть сообщение
Значит работает на 15битных значениях, а если будут 31битные, будет косяк. напр для 4000000000(четыре миллиарда)
Так вот при вызове

C++
1
PrintBin(4000000000);
Результат:
C++
1
11101110 01101011 00101000 00000000
0
Yevgenijz
11 / 11 / 1
Регистрация: 31.03.2009
Сообщений: 69
02.04.2009, 16:59 #12
Молодец!
Значит, действительно на твоем Си тип int содержит 32 разряда!
Оч. Хорошо!
Здорово!
Правда из задания было непонятно, нужно ли выводить двоичное число со знаком или без знака
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2009, 16:59
Привет! Вот еще темы с ответами:

Перевод десятичного числа в двоично-десятичную систему счисления - C++
Разработать программу и подпрограмму (подпрограммы), выполняющие действия согласно варианту задания 5 «перевод десятичного числа в...

Перевод целого числа в шестнадцатеричную систему - C++
Здравствуйте! Помогите пожалуйста написать задачу на С++ Написать функцию перевода целого положительного числа в шестнадцатеричную ...

Перевод целого числа в шестнадцатиричную систему счисления - C++
Задача: перевести int-овое число в х16 систему.

Перевод целого числа в двоичную систему счисления - C++
Вводится целое число n. Вывести это число в двоичной системе счисления!!...((( как?......


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.04.2009, 16:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru