Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/103: Рейтинг темы: голосов - 103, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
1

Необходимо вывести двоичное представление числа на экран.

16.02.2014, 13:12. Показов 21164. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно само задание..
Код вроде вполне правильный, но все же не работает((
Не могу понять в чем проблема..
Прошу руку помощи))

С клавиатуры вводится целое число. Необходимо вывести его двоичное представление на экран.
Программа должна поддерживать все целочисленные типы данных языка реализации (char, int, long int, unsigned int, unsigned long int для языка C/C++, integer, byte, word, shorting, longint для Pascal/Delphi).
Отрицательные числа выводятся в дополнительном коде.
Необходимо также решить обратную задачу: преобразовать двоичное число в десятичный вид.
Замечания:
1. Дополнительный код образуется из прямого путем инверсии бит и прибавления единицы:
Пример: -5: 5 = 00000101, -5 = not(5)+1 = 11111010+1 = 11111011
2. Запрещается использовать для машинно-зависимые методы и библиотеки языков программирования.
1. В качестве одного из вариантов решения предлагается следующие алгоритм на псевдоязыке:

Код
program Translate1;
s : string;
begin
 enter(a);
 s:=’’;
 while a<>0 do
   if  (abs(a) mod 2) then s:=’1’+s else s:=’0’+s;
   a:=abs(a) div 2;
 end while;
 if a<0 then
  mind:=0;
  for i:=1 to 8 do
    k:=val(s[8-i+1])+1+mind;
    s[8-i+1]:=k;
    if k=2 then begin
      s[8-i+1]:=’0’; mind:=1;
    endif  
    if k=3 then begin
      s[8-i+1]:=’1’; mind:=1;
    endif  
  endfor
 endif
end;
где div и mod  - операции целочисленного деления и деления по модулю соответственно.
 
program Translate1;
s : string;
begin
 enter(a);
 s:=’’;
 while a<>0 do
   if  (abs(a) shr 1) and (1 shl (sizeof(a)+1) + 1) then s:=’1’+s else s:=’0’+s;
   a:=abs(a) shr 2;
 end while;
 if a<0 then
  mind:=0;
  for i:=1 to 8 do
    k:=val(s[8-i+1])+1+mind;
    s[8-i+1]:=k;
    if k=2 then begin
      s[8-i+1]:=’0’; mind:=1;
    endif  
    if k=3 then begin
      s[8-i+1]:=’1’; mind:=1;
    endif  
  endfor
 endif
end;
где shr и sizeof - операции сдвига вправо и определения размера типа в битах соответственно.

А вод и код:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include"stdafx.h"
#include<iostream>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int main(void)
{ 
char *end; //указатель на последний символ строки
char str[32];
int k;
char str2[10];//строка с наибольшим числом
 
for (int i = 0; i <= 31; ++i)
str[k] = '0';
cout << "Vvedite desiatichnoe chislo:\n";
cin >> str2;
if (str2[0]=='-')
{
long int bb=strtol(str2,&end,10);//строку str2 по основанию 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 (int i=31;i>=0;i--)
{
if (str[k]=='1')
str[k]='0';
else
{str[k]='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 << "Chislo v desiatichnoi sisteme schislenia: "<<endl;
for (int i=0;i<=31;i++)
cout<<str[k];
cout<<endl;
 
{char str3[32];
char str[32];
long tmp = 0;//отрицательное
unsigned long int ptr=0;//положительное
for (int i = 0; i <= 31; ++i)
str[k] = '0';
cout<<"Vvedite chislo v dvoichnoi sisteme schislenia:\n"<<endl;;
cout<<"********************************"<<endl;
cout<<"\n";
cin>>str3;
{int k=0;
for(int i=31,k=strlen(str3)-1;i>=0;i--,k--)//весь массив заполняем нулями
{str[k]=str3[k];//а введенное число заносим в конец
if (k==0)
break;}
 
cout<<"Chislo v desiatichnoi sisteme (polo)I(itel'noe):\n";
for ( int i = 31, k = 0; i >= 0; i--, k++)
ptr= ptr + (str[k] - '0') * pow(2,k);//переводим двоичное число в положительное десятичное
cout<<ptr<<"\n"<<endl; //через степень числа 2
 
for ( k=0;k<=31;k++)
{
if (str[k]!='1')//инвертируем введенное двоичное число
str[k]='1';//0 меняем на 1 и наоборот
else
str[k]='0';
}
 
for (int i = 31, k = 0; i >= 0; i--, k++)
tmp = tmp + (str[k] - '0') * pow(2,k);
tmp=(tmp+1)*(-1); //прибавляем единицу по правилу
 
if (tmp<0)
{cout<<"Chislo v desiatichnoi sisteme(otricatel'noe):\n";
cout<<tmp<<endl;}}} //выводим отрицательное число
 
 
getchar();
system("pause");
}
Добавлено через 11 часов 47 минут
прошу Вас о помощи
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2014, 13:12
Ответы с готовыми решениями:

Ввести с клавиатуры натуральное число X (X<256). Вывести на экран двоичное представление этого числа (8 разрядов)
Ввести с клавиатуры натуральное число X (X&lt;256). Вывести на экран двоичное представление этого...

Вывести на экран двоичное представление беззнакового короткого целого
Используя битовые операции, вывести на экран двоичное представление беззнакового короткого целого.

Вывести двоичное представление введенного с клавиатуры десятичного числа
Помогите написать программу которая выводит двоичное представление введенного с клавиатуры...

Вывести двоичное представление натурального числа, используя рекурсию
Вывести двоичное представление данного натурального числа используя рекурсивную подпрограмму. Я...

20
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
17.02.2014, 23:17  [ТС] 2
заплачу, если надо будет

Добавлено через 3 часа 43 минуты
БЛИИН помогите пожалуйста
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
17.02.2014, 23:50 3
Хм. Ну давайте по очереди:
Функция принимает 2 аргумента: 1 - строка, в которую будет записан результат, 2 - число в любом из целочисленных форматов.
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
template<typename T>
void NumberAsBinary(char *_result, T _number)
{
    short int j = 0;
    if (_number > 0)//Если положительное
        for (T i = _number; i != 0; i /= 2, j++)
            _result[j] = ((_number^i) > _number) ? '0' : '1';
    else//Если отрицательное
    {
        _number *= -1;
        for (T i = _number; i != 0; i /= 2, j++)
            _result[j] = ((_number^i) > _number) ? '1' : '0';
        if (_result[j-1] == '1')//Прибавление 1
        {
            for (int i = j-1; i != -1; i--)
            {
                if (_result[i] == '1')
                    _result[i] = '0';
                else
                {
                    _result[i] = '1';
                    break;
                }
            }
        }
        else
            _result[j - 1] = '1';
    }
    _result[j] = 0;
}
Например из функции мейн вызывает:
C++
1
2
3
    char res[15];
    long dec = -56;
    NumberAsBinary(res, dec);
И после выполнения функции в строку res будет записано двоичное представление числа dec.
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
17.02.2014, 23:54  [ТС] 4
Alex566, не могли бы Вы отредактировать мой код?
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 00:20 5
Ну ладно.
1. перевод положительного числа в двоичную систему исчисления происходит правильно. Не понятно только почему при выводе вы выводите строку по символьно циклично + в цикле выводится все время один и тот же символ k. На 17 строке измените на
C++
1
2
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
, а на 63 на
C++
1
2
    for (int i = 0; i <= 31; i++)
        cout << str[i];
Да и число выводится в двоичной системе исчисления а написано что в десятичной.
Смотрю дальше..
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 00:29  [ТС] 6
Alex566, из двоичной в десятичную не правильно переводит. Спасибо, что помогаете)
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 00:32 7
2. Отрицательное число переводит в обратный код а не в дополнительный по той же самой причине:
C++
1
2
3
4
5
6
7
8
9
10
for (int i = 31; i >= 0; i--)
        {
            if (str[k] == '1')
                str[k] = '0';
            else
            {
                str[k] = '1';
                break;
            }
        }
За итератор взята переменная i, а обращение каждый раз происходит к элементу с индексом k, который даже не изменяется никак в ходе выполнения цикла.
Надо исправить на:
C++
1
2
3
4
5
6
7
8
9
for (int i = 31; i >= 0; i--)
        {
            if (str[i] == '1')
                str[i] = '0';
            else
            {
                str[i] = '1';
                break;
            }
И будет корректно выводиться число в дополнительном коде.

Добавлено через 2 минуты
На текущий момент код выглядит так:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include<iostream>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
 
int main(void)
{
    char *end; //указатель на последний символ строки
    char str[32];
    int k;
    char str2[10];//строка с наибольшим числом
 
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << "Vvedite desiatichnoe chislo:\n";
    cin >> str2;
    if (str2[0] == '-')
    {
        int bb = strtol(str2, &end, 10);//строку str2 по основанию 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 (int 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 << "Chislo v dvoichnoi sisteme schislenia: " << endl;
    for (int i = 0; i <= 31; i++)
        cout << str[i];
    /*
    char str3[32];
    char str[32];
    long tmp = 0;//отрицательное
    unsigned long int ptr = 0;//положительное
    for (int i = 0; i <= 31; ++i)
        str[k] = '0';
    cout << "Vvedite chislo v dvoichnoi sisteme schislenia:\n" << endl;;
    cout << "********************************" << endl;
    cout << "\n";
    cin >> str3;
    int k = 0;
    for (int i = 31, k = strlen(str3) - 1; i >= 0; i--, k--)//весь массив заполняем нулями
    {
        str[k] = str3[k];//а введенное число заносим в конец
        if (k == 0)
            break;
    }
 
    cout << "Chislo v desiatichnoi sisteme (polo)I(itel'noe):\n";
    for (int i = 31, k = 0; i >= 0; i--, k++)
        ptr = ptr + (str[k] - '0') * pow(2, k);//переводим двоичное число в положительное десятичное
    cout << ptr << "\n" << endl; //через степень числа 2
 
    for (k = 0; k <= 31; k++)
    {
        if (str[k] != '1')//инвертируем введенное двоичное число
            str[k] = '1';//0 меняем на 1 и наоборот
        else
            str[k] = '0';
    }
 
    for (int i = 31, k = 0; i >= 0; i--, k++)
        tmp = tmp + (str[k] - '0') * pow(2, k);
    tmp = (tmp + 1)*(-1); //прибавляем единицу по правилу
 
    if (tmp<0)
    {
        cout << "Chislo v desiatichnoi sisteme(otricatel'noe):\n";
        cout << tmp << endl;
    }
     //выводим отрицательное число
    */
    system("pause");
}
Закомментировал не проверенную область в которой к тому же были ошибки с расстановкой фигурных скобок.
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 00:45  [ТС] 8
Alex566, Александр, не смогли, бы Вы доделать мой код?
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 00:53 9
Masha_She, ну это все не за секунды делается. К тому же обратный перевод у вас действительно запутанный.
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 00:58  [ТС] 10
Alex566, ну пожааалуйста)) Вы очень добрый молодой человек) Помогите пожалуйста) Буду очень благодарна.
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 01:13 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <locale>
using namespace std;
 
int main(void)
{
    setlocale(0, "");
    char *end; //указатель на последний символ строки
    char str[32];
    int k;
    char str2[10];//строка с наибольшим числом
 
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << "Введите десятичное число: ";
    cin >> str2;
    if (str2[0] == '-')
    {
        long int bb = strtol(str2, &end, 10);//строку str2 по основанию 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 (int 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 << "Число в двоичной системе исчисления: ";
    for (int i = 0; i <= 31; i++)
        cout << str[i];
    char str3[32];
    long tmp = 0;//отрицательное
    unsigned long int ptr = 0;//положительное
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << endl << "Введите чиcло в двоичной системе исчисления: ";
    cin >> str3;
    for (int i = 31, k = strlen(str3) - 1; i >= 0 && k >= 0; i--, k--)//весь массив заполняем нулями
        str[i] = str3[k];//а введенное число заносим в конец
    cout << "Число в тесятичной системе исчисления (положительное): ";
    for (int i = 31, k = 0; i >= 0; i--, k++)
        ptr = ptr + (str[i] - '0') * pow(2, k);//переводим двоичное число в положительное десятичное
    cout << ptr << endl; //через степень числа 2
    //---------------------
    for (k = 0; k <= 31; k++)
    {
        if (str[k] != '1')//инвертируем введенное двоичное число
            str[k] = '1';//0 меняем на 1 и наоборот
        else
            str[k] = '0';
    }
 
    for (int i = 31, k = 0; i >= 0; i--, k++)
        tmp = tmp + (str[k] - '0') * pow(2, k);
    tmp = (tmp + 1)*(-1); //прибавляем единицу по правилу
 
    if (tmp<0)
    {
        cout << "Число в десятичной системе исчисления (отрицательное):\n";
        cout << tmp << endl;
    }
     //выводим отрицательное число
    system("pause");
}
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 01:17  [ТС] 12
Alex566, не хочу показаться наглой, но пожалуйста сможете до конца доделать?))
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 01:25 13
Программа переводит из десятичной в двоичную положительные и отрицательные числа. И двоичные переводит в десятичную но мне не понятен принцип по которому программа определяет положительное это двоичное число или отрицательное. В остальном программа работает (не учитывая то что написана она кривовато) но я просто сделал чтобы она работала.

Добавлено через 8 минут
Все теперь полностью работает
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <locale>
using namespace std;
 
int main(void)
{
    setlocale(0, "");
    char *end; //указатель на последний символ строки
    char str[32];
    int k;
    char str2[10];//строка с наибольшим числом
 
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << "Введите десятичное число: ";
    cin >> str2;
    if (str2[0] == '-')
    {
        long int bb = strtol(str2, &end, 10);//строку str2 по основанию 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 (int 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 << "Число в двоичной системе исчисления: ";
    for (int i = 0; i <= 31; i++)
        cout << str[i];
    char str3[32];
    long tmp = 0;//отрицательное
    unsigned long int ptr = 0;//положительное
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << endl << "Введите число в двоичной системе исчисления: ";
    cin >> str3;
    for (int i = 31, k = strlen(str3) - 1; i >= 0 && k >= 0; i--, k--)//весь массив заполняем нулями
        str[i] = str3[k];//а введенное число заносим в конец
    cout << "Число в десятичной системе исчисления (положительное): ";
    for (int i = 31, k = 0; i >= 0; i--, k++)
        ptr = ptr + (str[i] - '0') * pow(2, k);//переводим двоичное число в положительное десятичное
    cout << ptr << endl; //через степень числа 2
    for (k = 0; k <= 31; k++)
    {
        if (str[k] != '1')//инвертируем введенное двоичное число
            str[k] = '1';//0 меняем на 1 и наоборот
        else
            str[k] = '0';
    }
 
    for (int i = 31, k = 0; i >= 0; i--, k++)
        tmp = tmp + (str[i] - '0') * pow(2, k);
    tmp = (tmp + 1)*(-1); //прибавляем единицу по правилу
 
    if (tmp<0)
    {
        cout << "Число в десятичной системе исчисления (отрицательное): ";
        cout << tmp << endl;
    }
     //выводим отрицательное число
    system("pause");
}
1
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 01:28 14
Вот
Миниатюры
Необходимо вывести двоичное представление числа на экран.  
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 01:40  [ТС] 15
Alex566, я вот тоже задалась таким вопросом, что такое число в десятичной системе исчисления(положительное).. оно должно выводиться вообще?

Добавлено через 6 минут
Alex566, я имею ввиду то, что должно выводиться 1 решение.. Например,
Ввести число в двоич системе:1111
Оно должно выводить,
Десятичное число: -1
Чтобы был только ответ..
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 01:48 16
Лучший ответ Сообщение было отмечено Masha_She как решение

Решение

Ну тогда сделайте так:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <locale>
using namespace std;
 
int main(void)
{
    setlocale(0, "");
    char *end; //указатель на последний символ строки
    char str[32];
    int k;
    char str2[10];//строка с наибольшим числом
 
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << "Введите десятичное число: ";
    cin >> str2;
    if (str2[0] == '-')
    {
        long int bb = strtol(str2, &end, 10);//строку str2 по основанию 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 (int 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 << "Число в двоичной системе исчисления: ";
    for (int i = 0; i <= 31; i++)
        cout << str[i];
    char str3[32];
    long tmp = 0;//отрицательное
    unsigned long int ptr = 0;//положительное
    for (int i = 0; i <= 31; ++i)
        str[i] = '0';
    cout << endl << "Введите чиcло в двоичной системе исчисления: ";
    cin >> str3;
    for (int i = 31, k = strlen(str3) - 1; i >= 0 && k >= 0; i--, k--)//весь массив заполняем нулями
        str[i] = str3[k];//а введенное число заносим в конец
    for (int i = 31, k = 0; i >= 0; i--, k++)
        ptr = ptr + (str[i] - '0') * pow(2, k);//переводим двоичное число в положительное десятичное
    for (k = 0; k <= 31; k++)
    {
        if (str[k] != '1')//инвертируем введенное двоичное число
            str[k] = '1';//0 меняем на 1 и наоборот
        else
            str[k] = '0';
    }
 
    for (int i = 31, k = 0; i >= 0; i--, k++)
        tmp = tmp + (str[i] - '0') * pow(2, k);
    tmp = (tmp + 1)*(-1); //прибавляем единицу по правилу
 
    if (tmp<0)
    {
        cout << "Число в десятичной системе исчисления (отрицательное): ";
        cout << tmp << endl;
    }
    else
    {
        cout << "Число в десятичной системе исчисления (положительное): ";
        cout << ptr << endl; 
    }
     //выводим отрицательное число
    system("pause");
}
Добавлено через 1 минуту
Первый бит знаковый, все стольные числовые.
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 01:53  [ТС] 17
Alex566, последний вопрос) Можно каким-либо образом не писать все 32 знака. Например,
11111111111111111111111111111111
а написать например 1111???
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 02:03 18
Цитата Сообщение от Masha_She Посмотреть сообщение
Alex566, последний вопрос) Можно каким-либо образом не писать все 32 знака. Например,
11111111111111111111111111111111
а написать например 1111???
Все остальные знаки примет за нули. Самый первый - знаковый бит.
Откуда у вас эта программа?
0
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 31
18.02.2014, 02:38  [ТС] 19
Alex566, тоесть никак нельзя поменять на 1111?
0
244 / 155 / 48
Регистрация: 03.04.2013
Сообщений: 317
18.02.2014, 02:40 20
Цитата Сообщение от Masha_She Посмотреть сообщение
Alex566, тоесть никак нельзя поменять на 1111?
В смысле ограничить в 4 символа? И сделать максимальным числом 7?
0
18.02.2014, 02:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2014, 02:40
Помогаю со студенческими работами здесь

Используя битовые операции, вывести на экран двоичное представление беззнакового короткого целого
#include &lt;stdio.h&gt; int main(int argc, char* argv) { unsigned short int num; int i,...

Если известно десятичное представление числа 255, 7, то его двоичное представление
1. 11111111, 0111 2. 111111111,1110 3. 11111111, 111 4. FF, 3 5. 255, 111

Двоичное представление числа
Доброго времени суток =) Суть проблемы: есть текстбокс, туда пользователь вводит двоичные числа...

Двоичное представление числа
uses CRT; var m,r:integer; BEGIN read(m); while (m &gt; 0) do Begin r:=m mod 2; m:=m div 2;...

Двоичное представление числа
Введите целое положительное N и выведите его двоичное представление. Ниже представлен код, но он...

Двоичное представление числа x
Доброго времени суток,нужна помощь в написании программы. На вход программе подается целое число...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru