Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 1557
∙ повысить рейтинг »
_Ayl_
Статус: Студент
Рейтинг: 1426
∙ повысить рейтинг »
Micren
Статус: Специалист
Рейтинг: 1403
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1462
Дата выхода:31.12.2009, 23:30
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:678 / 182
Вопросов / ответов:1 / 2
IRC-канал по теме:#C

Вопрос № 175640: Дана текстовая строка, содержащая двоичное число, перевести его в 16-ричную систему счисления и записать во вторую строку ...



Вопрос № 175640:

Дана текстовая строка, содержащая двоичное число, перевести его в 16-ричную систему счисления и записать во вторую строку

Отправлен: 26.12.2009, 22:40
Вопрос задал: Супрунов С. М., Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает Kamerad, 8-й класс :
Здравствуйте, Супрунов С. М..

Предлагаю такой вариант решения.
Функция bits2num(char*) переводит символьную строку (состоящую из 1 и 0) в десятичное число.
Затем при помощи sprintf получаем шестнадцатиричное представление полученного числа в результирующей строке.

Код:

#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;

int bits2num(char *s)
{
int len=strlen(s);
int num=0;
for(int i=len-1;i>-1;i--)
{
if(s[i]=='1')
num+=pow((double)2,len-i-1);
}
return num;
}

int main()
{
char str1[20],str2[20];
cout<<"Enter str1 : ";
cin>>str1;
sprintf(str2,"%x",bits2num(str1));
cout<<"\nstr2 = "<<str2;
_getch();
}

Ответ отправил: Kamerad, 8-й класс
Ответ отправлен: 26.12.2009, 23:21

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 258153 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Micren, Специалист :
    Здравствуйте, Супрунов С. М..
    Программа. C++. Проверял MS VS 2008.

    Код:
    #include <locale>
    #include <iostream>
    #include <string>
    #include <stdexcept>

    using namespace std;

    // Ф-я преобразующая двоичную строку в шестнадцатиричную
    string bin2hex(string binStr)
    {
    // Шестнадцатиричные цифры
    static const char HEX_DIGITS[]="0123456789ABCDEF";
    // Результат
    string result;
    // Добавим нули к строке слева, чтоб длина стала кратной 4
    binStr=string((4-binStr.length()&3)&3,'0')+binStr;
    // Итераторы
    string::const_iterator it=binStr.begin(),end=binStr.end();
    while(it!=end)
    {
    // Обрабатывать будем 4ки двоичных цифр
    unsigned int tmp=0;
    size_t c ount=4;
    while(count--)
    {
    tmp<<=1;
    switch(*it)
    {
    case '0':
    break;
    case '1':
    tmp+=1;
    break;
    default:
    throw invalid_argument("В строке встретился элемент отличный от '0' или '1'");
    }
    ++it;
    }
    // Прибавим полученную цифру к строке
    result+=HEX_DIGITS[tmp];
    }
    try
    {
    // Удалим ведущие нули
    result=result.substr(result.find_first_not_of('0'));
    }
    catch(out_of_range&)
    {
    // Исключение может возникнуть если строка состояла целиком из нулей
    result='0';
    }
    return result;
    }

    int main()
    {
    locale::global(locale(""));
    string binStr;
    // Введем двоичную строку
    cout<<"Введите двоичное число:";
    cin>>binStr;
    try
    {
    // Преобразуем в шестнадцатиричную
    string hexStr=bin2hex(binStr);
    cout<<"Шестн адцатиричное число:"<<hexStr<<endl;
    }
    catch(invalid_argument& ex)
    {
    cout<<ex.what()<<endl;
    }
    system("PAUSE");
    return 0;
    }

    Примеры работы:
    Код:
    Введите двоичное число:0000000000000
    Шестнадцатиричное число:0

    Введите двоичное число:02020
    В строке встретился элемент отличный от '0' или '1'

    Введите двоичное число:10100001111110110101010100111010101010111111000
    Шестнадцатиричное число:50FDAA9D55F8

    Ответ отправил: Micren, Специалист
    Ответ отправлен: 27.12.2009, 00:31

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 258155 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.13 от 28.12.2009

    В избранное