0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
1

Вывести битовое представление целого числа со знаком

27.09.2017, 18:53. Показов 6686. Ответов 20
Метки c++, с++ (Все метки)

Проверьте пожалуйста код, просто выдает ошибки
задание было следующее: Ввести из стандартного потока число типа signed int.
Вывести его битовое представление.

вот сам код:
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
#include <stdio.h>
#include <conio.h>
int main () {
    signed int a, i, copy, m;
    int A[32]
    for (signed int i=0; i<=31;i++) {
        A[i]=1;
}
scanf_s("%d"&a);
copy=a;
i=0;
m=-1;
if (a==0)
{
    m=0;
    A[0]=0;
}
else {
    while(a!=0) {
        if (a%2==0) 
        {
            A[i]=0;
            if (copy<0)
            A[i]=1;
            a=a/2;
        }
        i++;
        m++;
    }
    if( copy<0){
        A[0]=A[0]+1;
        for(i=0;i<=m;i++)
        {
            if(A[i]==2){
                A[i]=0;
                if(i!=m)
                A[i+1]=A[i+1]+1;
            }
            
        }
        m=31;
    }
}
for(m;m>=0;m--)
printf("%d",A[m]);
printf("\n");
getchar();
retrun 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2017, 18:53
Ответы с готовыми решениями:

Битовое представление числа, старший байт
Здравствуйте, программисты. Имеется такой вот код. Все в это коде абсолютно понятно, не могли бы...

Вывести битовое представление целого числа со знаком
как можно упростить данный код и исправить ошибки? signed int b; signed int c; signed int d;...

Вывести строки, которые представляют собой запись целого числа со знаком
Дан файл, состоящий из строк. Вывести строки, которые представляют собой запись целого числа со...

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

20
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
27.09.2017, 18:58 2
Поставь код в тэги C++
0
Модератор
Эксперт С++
11348 / 9312 / 5594
Регистрация: 18.12.2011
Сообщений: 24,849
27.09.2017, 19:26 3
Исправил ошибки компилирования и вынес 25 строку за скобку
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
#include <stdio.h>
#include <conio.h>
int main () 
{
    const int SIZE=32;
    int a, i, copy, m;
    int A[32];
    for (int i=0; i<SIZE;i++)
        A[i]=1;
    puts("a=?");
    scanf_s("%d",&a);
    copy=a;
    i=0;
    m=-1;
    if (a==0)
    {
        m=0;
        A[0]=0;
    }else
    {
        while(a!=0) 
        {
            if (a%2==0) 
            {
                A[i]=0;
                if (copy<0)
                    A[i]=1;
            }
            a/=2;
            i++;
            m++;
        }
        if( copy<0)
        {
            A[0]=A[0]+1;
            for(i=0;i<=m;i++)
            {
                if(A[i]==2)
                {
                    A[i]=0;
                    if(i!=m)
                        A[i+1]=A[i+1]+1;
                }
 
            }
            m=SIZE-1;
        }
    }
    for(m;m>=0;m--)
        printf("%d",A[m]);
    printf("\n");
    getch();
    return 0;
}
0
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
27.09.2017, 20:45  [ТС] 4
спасибо вам большое. извините за глупые вопросы, просто учусь на 1 курсе

Добавлено через 15 минут
выдало такую ошибку после компиляции: 1>LINK : fatal error LNK1123: сбой при преобразовании в COFF: файл недопустим или поврежден

Добавлено через 11 минут
все работает, но резульаты выдало 0 из 5.
в консоли пишет a=?
так и должно быть?
0
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
27.09.2017, 20:46  [ТС] 5
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
#include <stdio.h>
#include <conio.h>
int main () 
{
    const int SIZE=32;
    int a, i, copy, m;
    int A[32];
    for (int i=0; i<SIZE;i++)
        A[i]=1;
    puts("a=?");
    scanf_s("%d",&a);
    copy=a;
    i=0;
    m=-1;
    if (a==0)
    {
        m=0;
        A[0]=0;
    }else
    {
        while(a!=0) 
        {
            if (a%2==0) 
            {
                A[i]=0;
                if (copy<0)
                    A[i]=1;
            }
            a/=2;
            i++;
            m++;
        }
        if( copy<0)
        {
            A[0]=A[0]+1;
            for(i=0;i<=m;i++)
            {
                if(A[i]==2)
                {
                    A[i]=0;
                    if(i!=m)
                        A[i+1]=A[i+1]+1;
                }
 
            }
            m=SIZE-1;
        }
    }
    for(m;m>=0;m--)
        printf("%d",A[m]);
    printf("\n");
    getch();
    return 0;
}
запустил данную программу, но в консоль выдало "a=?"
задание было следующее: Ввести из стандартного потока число типа signed int.
Вывести его битовое представление.
0
1265 / 1023 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
28.09.2017, 11:58 6
petrucho12312, код следует заключать в теги, иначе его трудно читать.
0
3370 / 1925 / 370
Регистрация: 09.09.2017
Сообщений: 7,874
28.09.2017, 13:48 7
Программа компилируется (разумеется, после исправления ошибок с conio, scanf_s и getch) и частично работает.
С отрицательными числами косяк, а ведь в задании указано signed int.
Алгоритм кажется слишком навороченным, но это на любителя. Так в чем вопрос?
0
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
28.09.2017, 13:58  [ТС] 8
мне не найти ошибок, не могли бы вы мне подсказать?
0
3370 / 1925 / 370
Регистрация: 09.09.2017
Сообщений: 7,874
28.09.2017, 14:03 9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main(){
  unsigned int x;
  char str[8*sizeof(x)+1]; //немного магии с определением размера массива (стандарт не оговаривает размер signed int)
  char *res;
//кто-нибудь знает, зачем вообще нужен scanf_s ? Чем им стандартный scanf не угодил, не может же тут быть NIH ?!
  scanf("%i",&x); //вводим как signed int, но храним в unsigned
  res = str+sizeof(str); //заполнение строки идет с конца (с младшего бита)
  *res = 0; //конец строки
  do{
    res--; //переход к следующему символу в строке
    if( x & 1 )*res = '1'; else *res = '0'; //проверка бита
    x>>=1; //переход к следующему биту
  }while(x != 0); //если число кончилось - ведущие нули игнорируем
  printf("%s\n",res);
}
0
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
28.09.2017, 14:27  [ТС] 10
это готовый код? я щас в нем разбираюсь, могу ли я его отправить на проверку преподавателю? просто некоторые команды из кода не проходили еще.

Добавлено через 2 минуты
и еще, в конце не нужно return 0 написать?
0
3370 / 1925 / 370
Регистрация: 09.09.2017
Сообщений: 7,874
28.09.2017, 14:38 11
Цитата Сообщение от petrucho12312 Посмотреть сообщение
это готовый код?
Да, я его у себя компилировал с прогнал пару тестов - на них все работало.
Цитата Сообщение от petrucho12312 Посмотреть сообщение
могу ли я его отправить на проверку преподавателю?
Как там пишут в лицензиях на творческие произведения - с обязательным указанием автора! Шучу, конечно - делайте с ним что хотите.
Цитата Сообщение от petrucho12312 Посмотреть сообщение
некоторые команды из кода не проходили еще
откуда ж мне знать что вы проходили а что нет. Если боитесь sizeof, подставьте в размер строки 65, а в res = str+64; Если уверены, что int всегда 32-битный, можете поставить 32.
Вместо if( x & 1 ) можно использовать проверку на четность if( x % 2 == 1 ), но это не так красиво
Цитата Сообщение от petrucho12312 Посмотреть сообщение
и еще, в конце не нужно return 0 написать?
Вообще, return 0 (точнее, возврат кода ошибки) из main'а нужен для того чтобы из отдельных консольных команд собирать развесистые цепочки скриптов. Так что для реальной программы, это НУЖНО написать, но для одноразовых учебных - без разницы.
Цитата Сообщение от petrucho12312 Посмотреть сообщение
я щас в нем разбираюсь
Вот это радует. Побольше бы таких, кто честно пытается разобраться. В таком случае тем более стоит разобраться с этим кодом - это один из стандартных способов перевода числа в строку в любой системе счисления. Конкретно мой годится только для двоичной, но если сообразите как переделать под другую - только в плюс вам.
0
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
28.09.2017, 15:05  [ТС] 12
а тут можно писать в личные сообщения? есть пару вопросов

Добавлено через 6 минут
COKPOWEHEU, тут можно как-нибудь в личные сообщения написать?
0
3370 / 1925 / 370
Регистрация: 09.09.2017
Сообщений: 7,874
28.09.2017, 15:27 13
Если по коду, то лучше здесь - вдруг еще кому-то будет интересно.
0
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
28.09.2017, 15:42  [ТС] 14
COKPOWEHEU, по другому вопросу.
0
Велосипедист...
351 / 218 / 73
Регистрация: 15.12.2015
Сообщений: 785
28.09.2017, 21:01 15
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
стандарт не оговаривает размер signed int
Но он и не оговаривает кол-во бит в байте. CHAR_BIT вместо 8:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
C
1
char str[8*sizeof(x)+1];

Не по теме:

Хотя, возможно, Вы это знаете, но не стали ТСа напрягать :umnik:

0
3370 / 1925 / 370
Регистрация: 09.09.2017
Сообщений: 7,874
28.09.2017, 21:45 16
Не 32-битные int это норма, а вот с не 8-битными char'ами не встречался. Где такие водятся? А то можно доабстрагироваться до не-двоичной системы
0
Mournful Max
28.09.2017, 22:32
  #17

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
... с не 8-битными char'ами не встречался. Где такие водятся?
Я сам не встречал, но они есть :D
На самом деле, об этом иногда пишут в книгах, но это обычно идет как сноска. Да и та же Википедия упоминает, что байт не обязательно 8 бит. Часто вместо того, чтобы не уточнять, что байт 8-битный, его называют октетом. Хотя, наверное, сейчас это не так существенно, ибо большинство платформ все-таки 8 битные :)

0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
6017 / 3587 / 2511
Регистрация: 22.11.2013
Сообщений: 10,200
Записей в блоге: 1
29.09.2017, 00:17 18
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
void t(signed n, unsigned m);
 
int main(void)
{
    int n;
    scanf(" %d",&n);
    t(n,1); printf("\n");
    return 0;
}
 
void t(signed n, unsigned m)
{
    if (0==m) return;
    t(n,m<<1); printf("%d",0!=(n&m));
}
2
COKPOWEHEU
29.09.2017, 00:41
  #19

Не по теме:

Цитата Сообщение от Captain Maxee Посмотреть сообщение
Я сам не встречал, но они есть
когда-то, в начале времен, существовали 4, 5, 6-битные машины. При передаче по RS232 используются не 8-битные слова (от 6 бит данных вроде, плюс стартовый бит, бит четности и 1-2 стоповых).
Но сейчас во всех известных мне 8, 16, 32 и 64 битных архитектурах байт это 8 бит.
Так что если так уж хочется это учесть, лучше в начале написать что-то вроде
C
1
2
3
#if (CHAR_BIT != 8 )
#error под такое извращение сам логику переписывай
#endif

1
0 / 0 / 0
Регистрация: 27.09.2017
Сообщений: 56
04.10.2017, 12:41  [ТС] 20
COKPOWEHEU, зачем в коде используется unsigned?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2017, 12:41

Битовое представление вещественного числа, ошибка в коде
#include &lt;iostream&gt; using namespace std; void binary (double x); //функция вывода...

Вводим n. Нам нужно битовое представление этого числа
Вводим n. Нам нужно битовое представление этого числа Как-то не получается у меня с этой темой

Ввод целого числа со знаком
Помогите найти ошибку в функции считывания целого числа со знаком. Программа неверно считывает...

Является ли заданный текст правильной записью целого числа со знаком.
Помогите пожалуйста! Определить, является ли заданный текст правильной записью целого числа со...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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