Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двоичное представление числа 
:(
    Опции темы
Compositum
Дата 13.6.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Нацарапал на C код, который должен отображать тип int в двоичном представлении. Одна фукция в двоичном виде показывает всё число, а вторая - значение конкретного бита. Используя эти функции нацарапал два варианта представления одного и того же числа, но вижу, что результаты получаются разными. Я так понимаю, что что-то не так сделал во второй функции (извлечение конкретного бита), но что-то пока никак не найду где именно ошибся... Исходный код:
Код

/*
Файл a.c
*/
#include<stdio.h>

void i2bs(int val, char *d, char ts, char bs);
short int getbit(int source, int index);

int main(){
    long int size = sizeof(int);
    long int bsize = size * 8;
    printf("size of int type: %ld %s\n", size, 
        (size == 1) ? "byte" : "bytes");    
    //строка результата в виде нулей и единиц
    char d[bsize + bsize/4 + 1];
    //Число, двоичное представление которого интересует
    int val = 123456789;
    printf("int value: %d\n", val);    
    //Первый вариант получения двоичного представления
    printf("bytes (var 1):\n");
    i2bs(val, d, '-', ' ');
    printf("%s\n", d);
    //Второй вариант получения двоичного представления
    printf("bytes (var 2):\n");
    int i;
    for (i = bsize - 1; i >= 0; --i){        
        printf("%d", getbit(val,i));
        //Разбиваю байты на группы по 4 бита
        if (!(i % 4) && (i % 8)) 
            putchar('-');
            
        if (!(i % 8) && i > 0) 
            putchar(' ');
    }
    putchar('\n');    
}

/*
Получение двоичного представления целого числа (тип int)
в отформатированном строковом представлении.
Параметры функции:
int val - интересующее нас число
char *d - указатель на массив символов, в который требуется
записать результат
char ts - символ, являющийся разделителем тетрад байта
(если разделитель не нужен - следует передать 0)
char bs - символ, являющийся разделителем битов др. от др.
(если разделитель не нужен - следует передать 0)
*/
void i2bs(int val, char *d, char ts, char bs){
    long int size = sizeof(int);    
    int i, m;
    for (i = size * 8 - 1, m = 0; i >= 0; --i, ++m){        
        d[m] = (val >> i) & 1 ? '1' : '0';        
        //Разбиваю байты на группы по 4 бита
        if (ts && !(i % 4) && (i % 8)) 
            d[++m] = ts;
            
        if (bs && !(i % 8) && i > 0) 
            d[++m] = bs;
    }
    d[m] = '\0';
}

/*
Получение значения конкретного бита в целом числе типа int
*/
short int getbit(int source, int index){
    return (source >> index) && 1;
}

Результат работы:
Цитата(Терминал)

bush@mycomp:~/training/c/c89/mytests$ gcc a.c -o a.out
bush@mycomp:~/training/c/c89/mytests$ ./a.out 
size of int type: 4 bytes
int value: 123456789
bytes (var 1):
0000-0111 0101-1011 1100-1101 0001-0101
bytes (var 2):
0000-0111 1111-1111 1111-1111 1111-1111
bush@mycomp:~/training/c/c89/mytests$ 

Может кто свежим взглядом разглядит мой промах?

п.с. А вообще в C89/C99 имеются встроенные функции, выполняющие те же задачи, что я написал выше, или нет (сам не нашёл)?
PM   Вверх
triclosan
Дата 13.6.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(Compositum @  13.6.2011,  13:17 Найти цитируемый пост)
return (source >> index) && 1;

&
PM MAIL   Вверх
awesome
Дата 13.6.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Код

return (source >> index) && 1

&

опоздал=)

Это сообщение отредактировал(а) awesome - 13.6.2011, 13:46
PM MAIL   Вверх
Compositum
Дата 13.6.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



млин. smile ну конечно же... Спасибо всем!
PM   Вверх
Compositum
Дата 13.6.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



а касательно библиотечных функций: я изобретаю велосипед, или в стандартной библиотеке такие отсутствуют?
PM   Вверх
borisbn
Дата 13.6.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Compositum @  13.6.2011,  14:02 Найти цитируемый пост)
а касательно библиотечных функций: я изобретаю велосипед, или в стандартной библиотеке такие отсутствуют?


itoa


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Compositum
Дата 13.6.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(borisbn @ 13.6.2011,  14:47)
Цитата(Compositum @  13.6.2011,  14:02 Найти цитируемый пост)
а касательно библиотечных функций: я изобретаю велосипед, или в стандартной библиотеке такие отсутствуют?


itoa

Спасибо!
PM   Вверх
bsa
Дата 13.6.2011, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата
This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.
Эта функция нестандартна. Поэтому программа ее вызывающая может однажды не собраться.
PM   Вверх
borisbn
Дата 14.6.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(bsa @  13.6.2011,  19:27 Найти цитируемый пост)
Эта функция нестандартна. Поэтому программа ее вызывающая может однажды не собраться.

Это-то, ессно, так, но я не знаю другой функции из библиотеки, поставляемой с minGW и MSVC, которая бы обеспечивала такое преобразование...
Не факт, что такой нет, просто я не знаю


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1455 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.