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

Программа показывающая внутреннее двоичное представление типа данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Cooller51190
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 78
16.04.2013, 16:56     Программа показывающая внутреннее двоичное представление типа данных #1
Необходимо показать внутреннее двоичное представление типа данных, используя операции сдвига(<<,>>) и поразрядные логические операции (&,|,~,^). Вот не знаю как реализовать...
Нечто подобное нашел на паскале, но такое ащущение что где-то есть ошибка при выводе.
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.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 19:56     Программа показывающая внутреннее двоичное представление типа данных #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
#include <iostream>
 
typedef unsigned char uchar;
 
// вывод внутреннего представления данных (internal data representation)
void printIDR(const void *object, const size_t OBJECT_SIZE);
 
int main()
{
   int a = 2;
 
   printIDR(&a, sizeof (a));
 
   return 0;
}
 
void printIDR(const void *object, const size_t OBJECT_SIZE)
{
   uchar *uobj = (uchar *) object;
 
   for (int i = 0; i < OBJECT_SIZE; ++i, ++uobj)
   {
      uchar mask = ~0; // маска вида 10..000000
      mask >>= 1;
      mask = ~mask;
 
      while (mask)
      {
         if (*uobj & mask)
            std::cout << '1';
         else
            std::cout << '0';
 
         mask >>= 1;
      }
      std::cout << ' ';
   }
 
   std::cout << std::endl;
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 22:52     Программа показывающая внутреннее двоичное представление типа данных #3
Cooller51190,

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
#include <iostream>
#include <iomanip>
using namespace std;
 
void displayBits(unsigned);
 
int main()
{
    unsigned number;
 
    cout << "Enter the number: ";
        cin >> number;
 
    displayBits(number);
 
    cout << "\n\n";
    return 0;
} 
 
void displayBits(unsigned value)
{
    //size определяет размер типа данных(1,2,4 - байта)
    unsigned c, size(sizeof(unsigned) * 8), displayMask = 1 << (size - 1);
 
    cout << setw(7) << "value = ";
 
    for(c = 1; c <= size; c++)
    {
        cout << (value & displayMask ? '1' : '0');
            value <<= 1;
 
        if(c % 8 == 0)
            cout << " ";
    }
 
    cout << "\n";
}
Добавлено через 12 минут
Cooller51190, еще так можно

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
#include <iostream>
#include <iomanip>
#include <bitset>
#include <limits>
using namespace std;
 
void displayBits(int);
 
int main()
{
    int number;
 
    cout << "Enter the number: ";
        cin >> number;
 
    displayBits(number);
 
    cout << "\n\n";
    return 0;
} 
 
void displayBits(int value)
{
    cout << setw(7) << "value = " << 
        bitset<numeric_limits<unsigned long int>::digits>(value);
 
    cout << "\n";
}
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.04.2013, 09:22     Программа показывающая внутреннее двоичное представление типа данных #4
yoghurt92, у тебя код настроен только на тип int, а у меня любой тип ;-)
Можно хоть структуру передать, хоть массив, хоть что. Плюс у меня используются только приемы, разрешенные в задании, а у тебя внешние библиотеки
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
17.04.2013, 14:52     Программа показывающая внутреннее двоичное представление типа данных #5
Buckstabue, ну я показал частный случай, можно и так и так, согласен, твой код более обобщенный, но мой код тоже правильный

Добавлено через 5 минут
Buckstabue, сейчас запустил твой вариант, у тебя с выводом проблема, двойку выдает как
00000010 00000000 00000000 00000000 а должно быть
00000000 00000000 00000000 00000010 поправь меня если не прав
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.04.2013, 21:21     Программа показывающая внутреннее двоичное представление типа данных #6
yoghurt92, в том-то и дело, что должно выводить внутреннее представление. А у процессора x86 внутреннее представление чисел little endian. Так что твой код неправильный ;-)
Подробнее здесь
http://ru.wiktionary.org/wiki/little-endian
http://ru.wikipedia.org/wiki/%D0%9F%...B5.D0.BC.D1.83
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
17.04.2013, 21:41     Программа показывающая внутреннее двоичное представление типа данных #7
Buckstabue, ну все ровно, тогда нужно 01000000 00000000 00000000 00000000
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.04.2013, 21:50     Программа показывающая внутреннее двоичное представление типа данных #8
yoghurt92, там порядок следования байтов *facepalm*
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
17.04.2013, 21:57     Программа показывающая внутреннее двоичное представление типа данных #9
Buckstabue, спасибо, я этого не знал И мне кажется *facepalm* тут не к чему, вы тоже многого не знаете
Cooller51190
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 78
18.04.2013, 22:44  [ТС]     Программа показывающая внутреннее двоичное представление типа данных #10
Buckstabue подскажи если не трудно, что необходимо поправить чтоб использовать число с плавающей запято?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 23:21     Программа показывающая внутреннее двоичное представление типа данных
Еще ссылки по теме:

C++ Двоичное представление символов
C++ Внутреннее представление числа в памяти
C++ Двоичное представление

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

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
19.04.2013, 23:21     Программа показывающая внутреннее двоичное представление типа данных #11
Cooller51190,
C++
1
2
3
4
5
6
7
8
int main()
{
   double a = 2;
 
   printIDR(&a, sizeof (a));
 
   return 0;
}
Yandex
Объявления
19.04.2013, 23:21     Программа показывающая внутреннее двоичное представление типа данных
Ответ Создать тему
Опции темы

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