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

Двоичное представление типов данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.59
Devik
0 / 0 / 0
Регистрация: 27.05.2009
Сообщений: 11
14.03.2010, 15:28     Двоичное представление типов данных #1
Всем привет. Не могли бы вы мне помочь пожалуйста с такой задачей на С++: необходимо на экран выдать двоичное представление переменной разных типов данных. Int, float, char, запись. Заранее благодарен. Может у кого то остались какието исходники или что то что может помочь данную задачю. Может есть какието специальные функции для побитового вывод на экран.
Вот есть рабочая программа на паскале. Может кто то пределать код на с++ пожалуйста

Pascal
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
Program LAB1;
uses crt;
{==== Процедура распечатки байта в двоичном виде ====}
Procedure WriteByte(a : byte);
var i : integer;
begin
for i:=7 downto 0 do begin
{ Сдвиг на i бит вправо и выделение младшего бита }
if ((a shr i) and $01) <>0 then write('1')
else write('0');
end;
write(' ');
end;
{==== Главная процедура ====}
type bytearr = array[1..100] of byte;
type intptr = ^integer;
var
k,i : integer; { Счетчик бит}
{ Анализируемые переменные }
int : integer; { целое }
str : string[10]; { строка }
pint : intptr; { указатель на integer }
ipt : ^intptr; { указатель на указатель на integer }
px : pointer; { Промежуточный безтипный указатель }
bp : ^bytearr; { Указатель на массив байт }
{ массив целых для проверки изменения адресов }
iarr : array[1..5] of integer;
 
begin
{ Анализ типа integer }
int:=518; { Присвоение значения }
bp:=@int; { Получение указателя }
{ Побайтная распечатка }
writeln('Целое число');
for k:=1 to 2 do writebyte(bp^[k]);
writeln;
 
{ Анализ типа string }
str:='ABCD'; { Присвоение значения }
px:=Addr(str); { Получение указателя }
bp:=px; { Преобразование типа указателей }
{ Побайтная распечатка }
writeln('Строка символов');
for k:=1 to 11 do writebyte(bp^[k]);
writeln;
 
end.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
14.03.2010, 15:37     Двоичное представление типов данных #2
a_in_b.cpp
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#include "my.hpp"
 
using namespace std;
 
//опис констант-----------------------------------------------------------------
const int base = 1000*1000;         //база числа в довгій арифметиці
 
//опис функцій------------------------------------------------------------------
void Menu();
void Notation(string &, int &, int &);
vector <int> NotationFrom(string, int &);
vector <int> NotationTo(vector <int>, int &);
string NotationDiv(string, int &, int &);
vector <int> Div(vector <int>, int, int &);
vector <int> Mult(vector <int>, int);
vector <int> Sum(vector <int>, vector <int>);
 
//MAIN()------------------------------------------------------------------------
int main()
{
    Menu();
    return 0;
}
 
//меню програми----------------------------------------------------------------
void Menu()
{
    while (1)
    {
        int from, to;
        string s;
        cout << "Введiть початкову систему числення [2..36]: ";
        while( !(from = Check()) ) cout << "помилка введення\n\nспробуйте ще раз: ";
        cout << "\nВведiть кiнцеву систему числення [2..36]:   ";
        while( !(to = Check()) ) cout << "помилка введення\n\nспробуйте ще раз: ";
        cout << "\nВведiть число:                              ";
        cin >> s;
        cout << endl;
 
        Notation(s, from, to);
            
        if (my::exit()) break;
    }
}
 
//основна функція---------------------------------------------------------------
void Notation(string &s, int &from, int &to)
{
    //переводимо цілу частину в десяткову систему числення
    vector <int> res;
    Up(s);
    int count = 0;
    FOR(i,0,s.size()) 
        if ( !IsPoint(s[i]) ) ++count;
        else break;
    res = NotationFrom(s.substr(0,count), from);
    cout << "Десяткове представлення:\n";
    for (int i(res.size()-1); i > -1; --i)
        cout << res[i];
 
    //переводимо дробову частину в десяткову систему числення
    double dd = 0,
        base = 1;
    int ok = (s[0] == '0'); //перевірка на наявність цілої частини
    string ds = "", d = "";
    if (count < s.size())
    {
        s = s.substr(count+1, s.size()-count);
        FOR(i,0,s.size())
            dd += (base /= from) * (s[i] - '0');
        FOR(i,0,10)
        {
            ds += int(dd *= 10) + '0';
            dd -= int(dd);
        }
        Normalization(ds);
        if(ds.size()) cout << "." << ds << endl;
        d = NotationDiv(s, from, to);
    }
    
    //переводимо число в бажану систему числення
    cout << "\n\nПредставлення числа в системi з основою " << to << ":" << endl;
    res = NotationTo(res, to);
    s.clear();
    for (int i(res.size()-1); i > -1; --i)
        s += ( (res[i]/10) ? (res[i] - 10 + 'A') : (res[i] + '0') );
    s += "." + d;
    Normalization(s);
 
    cout << (s[0] == '.' ? "0" : "") << s << endl << endl;
}
 
//функція для переведення числа в 10-ву систему числення------------------------
vector <int> NotationFrom(string s, int &from)
{
    vector <int> res, d, b;
    res.push_back(0);
    b.push_back(1);
    for (int i(s.size()-1); i > -1; --i)
    {
        d.clear();
        d = Mult(b, (isalpha(s[i])) ? (int(s[i] - 'A') + 10) : (int(s[i] - '0')));
        res = Sum(res, d);
        b = Mult(b, from);
    }
    return res;
}
 
//функція для переведення числа в систему числення з основою 2..36--------------
vector <int> NotationTo(vector <int> a, int &to)
{
    vector <int> res;
    int carry = 0;
    while (a.size() != 1 || (a.back() != 0 && a.size() == 1) )
    {
        a = Div(a, to, carry);
        res.push_back(carry);
    }
    return res;
}
 
//переведення дробової частини числа
string NotationDiv(string s, int &from, int &to)
{
    string res = "";
    double d = 0, base = 1;
    FOR(i,0,s.size())   
        d += (base /= from) * (s[i] - '0');
    FOR(i,0,10)
    {
        res += int(d *= to) + '0';
        d -= int(d);
    }
    return res;
}
 
//ділення довгого на коротке, повернення результуючого вектора на остачі--------
vector <int> Div(vector <int> a, int b, int &carry)
{
    carry = 0;
    for (int i = (a.size()-1); i > -1; --i)
    {
        long long cur = carry * base + a[i];
        a[i] = int (cur / b);
        carry = int (cur % b);
    }
    while (a.size() > 1 && a.back() == 0)
        a.pop_back();
    return a;
}
 
//множення довгого на коротке, повернення результуючого вектора-----------------
vector <int> Mult(vector <int> a, int n)
{
    int carry = 0;
    for (int i = 0, _n(a.size()); i < _n || carry; ++i)
    {
        if (i == a.size()) a.push_back(0);
        long long cur = carry + a[i] * n;
        a[i] = (int) cur % base;
        carry = (int) cur / base;
    }
    return a;
}
 
//додавання 2-ох довгих, повернення результуючого вектора-----------------------
vector <int> Sum(vector <int> a, vector <int> b)
{
    if (a.size() < b.size()) swap(a,b);
    int carry = 0;
    for (int i = 0, _n(a.size()); i < _n || carry; ++i)
    {
        if (i == a.size())
            a.push_back(0);
        if (i == b.size())
            b.push_back(0);
        long long cur = a[i] + b[i] + carry;
        a[i] = (int) cur % base;
        carry = (int) cur / base;
    }
    return a;
}

my.hpp
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
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <windows.h>
#include <conio.h>
 
#define FOR(i,a,b) for (int i = a, _n(b); i < _n; ++i)
#define ABS(a) ( (a) < 0 ? -(a) : a )
 
//оголошення констант ----------------------------------------------------------
const int tSleep = 1500;        //час затримки
 
//перевантаження операторів введення -------------------------------------------
std::ostream &operator << (std::ostream &cout, const char text[])
{
    char *s = new char [strlen(text)+1];
    CharToOem(text, s);
    cout.write(s,strlen(s));
    return cout;
}
 
std::ostream &operator << (std::ostream &cout, const char text)
{
    const char s[] = {text,'\0'};
    char *ds = new char [2];
    CharToOem(s, ds);
    cout.write(ds,strlen(ds));
    return cout;
}
 
//меня виходу ------------------------------------------------------------------
namespace my
{
    int exit()
    {
        int exit = 0;
        while (exit != '2')
        {
            std::cin.clear();
            std::cout << "Виберiть дiю:\n\n"
                     "1 - вийти\t"
                     "2 - продовжити\n";
            exit = getch();
            if (exit == '1')
            {
                system("cls");
                std::cout << "завершення..";
                Sleep(tSleep);
                return 1;
            }
            if (exit != '2')
            {
                system("cls");
                std::cout << "\nПомилка введення\t"
                         "спробуйте ще раз ";
                Sleep(tSleep);
            }
            system("cls");
        }
        return 0;
    }
}
 
//==============================================================================
 
//                            додаткові функції
 
//==============================================================================
 
//перевірка символа на належність "." ------------------------------------------
inline int IsPoint(char &s) { return s == '.'; }
 
//перевірка чи являеться стрічка цілим числом-----------------------------------
int IsDigit(std::string &s)
{
    FOR(i,0,s.size()) if (s[i] < '0' || s[i] > '9') return 0;
    return 1;
}
 
//перевірка на допустимий діапазон значень для систем числення -----------------
int Check()
{
    std::string s;
    std::cin >> s;
    std::stringstream tmp;
    tmp << s;
    int res;
    tmp >> res;
    return (res <= 36 && res >= 2 && IsDigit(s)) ? (res) : (0);
}
 
//переведення стрічки у верхній регістр-----------------------------------------
void Up(std::string &s) { FOR(i,0,s.size()) if (isalpha(s[i])) s[i] += (s[i] >= 'a') ? ('A'-'a') : (0); }
 
//нормалізація стрічки
void Normalization(std::string &s)
{
    int count = 0;
    while (s[s.size()-count-1] == '0') ++count;
    if ( s[s.size()-count-1] == '.') ++count;
    s = s.substr(0, s.size() - count);
}
Devik
0 / 0 / 0
Регистрация: 27.05.2009
Сообщений: 11
14.03.2010, 15:52  [ТС]     Двоичное представление типов данных #3
Спасибо большое. Скажите а первый код это перевод чиста в одной системы изчесления в другую а второй это двоичное представление в памяти? Мне просто нада двоичное представление например там тип double это 8 байт и как какоето число выглядит.
к примеру:
double 13.65 это
11001101 11001100 11001100 11001100 11001100 01001100 00101011 01000000
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
14.03.2010, 16:07     Двоичное представление типов данных #4
скомпилируйте и переведите из 10 в 2 дробь 13,65
Devik
0 / 0 / 0
Регистрация: 27.05.2009
Сообщений: 11
14.03.2010, 17:08  [ТС]     Двоичное представление типов данных #5
Я вот пробую откомпелировать ее в с++ 3,11 и не получаетса файлы не может подключить может в какомто другом попробовать точнее в какой среде Вы программировали что я б в точно такой как у вас открывал их
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
14.03.2010, 19:18     Двоичное представление типов данных #6
Devik, выбирайте любую Бесплатные среды (IDE) для программирования на С/С++
Yandex
Объявления
14.03.2010, 19:18     Двоичное представление типов данных
Ответ Создать тему
Опции темы

Текущее время: 22:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru