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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Си] Перевод в двоично-десятичное представление 
:(
    Опции темы
mr.Anderson
Дата 30.10.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Задача следующая.

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

Я решил через простой перебор всех имеющихся цифр (в цикле) и превращение их в нужный код просто кучкой if, проверяющих, какой цифре какой код соответствует.

Однако, преподше это не понравилось. Она сказала, что тут есть "классное решение, и туда преобразует, и обратно, прям такое классное, без всяких толп if и прочего". Не подскажете такое решение? smile Понимаю, запрос расплывчатый, но она так объяснила.

ЗЫ на всякий случай:
Цитата

Dec      Bin
  0  =  0000
  1  =  0001
  2  =  0010
  3  =  0011
  4  =  0100
  5  =  0101
  6  =  0110
  7  =  0111
  8  =  1000
  9  =  1001



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 30.10.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Блин, народ, помогите, завтра сдавать уже! Навряд ли это так сложно, но я не могу придумать ничего, кроме перебора.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Hades
Дата 30.10.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

int val = 7;

for(int t = 8; t > 0; t /= 2)
    if (0 != (val&t))
        printf("1");
    else
        printf("0");

PM MAIL   Вверх
mr.Anderson
Дата 30.10.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Hades, а объяснить можете?

Это сообщение отредактировал(а) mr.Anderson - 30.10.2008, 20:45


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Hades
Дата 30.10.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



поочерёдно проверяем биты числа.

как работает & думаю не надо обьяснять?

val = 7 // 0111

0111&1000(7&8) // 1-й бит, если он в семёрке = 1, то результат будет 8, если он в семёрке = 0, то результат будет 0
0111&0100(7&4) // 2-й бит, если он в семёрке = 1, то результат будет 4, если он в семёрке = 0, то результат будет 0
0111&0010(7&2) // 3-й бит, если он в семёрке = 1, то результат будет 2, если он в семёрке = 0, то результат будет 0
0111&0001(7&1) // 4-й бит, если он в семёрке = 1, то результат будет 1, если он в семёрке = 0, то результат будет 0
PM MAIL   Вверх
mr.Anderson
Дата 30.10.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Hades, ничего не понял... Поподробней... Пожалуйста.

Это сообщение отредактировал(а) mr.Anderson - 30.10.2008, 21:00


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 30.10.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Плюс я ж говорю, решение должно конвертить и туда, и обратно. А ваше только цифру конвертит. Т.е. все равно циклом проходить придется, причем, это перевод только "туда". А обратно как.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Hades
Дата 30.10.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(mr.Anderson @  30.10.2008,  16:21 Найти цитируемый пост)
Реализовать функцию перевода имеющегося числа в двоично-десятичное представление и обратно.

можно посмотреть прототип этой функции, и если возможно, то что она выводит.

Цитата(mr.Anderson @  30.10.2008,  21:16 Найти цитируемый пост)
 А обратно как.

xyzr = 0111

x*2^3 + y*2^2 + z*2^1 + r*2^0
PM MAIL   Вверх
mr.Anderson
Дата 30.10.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Hades, да где бы его взять, этот прототип. Его самому надо придумать. smile Насчет что выводит: получает, допустим, 15, выводит, соответственно, 00010101.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
destrd
Дата 30.10.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



из 2->10

Код

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    const char *bin = "11101000";
    int counter = 1;
    int result = 0;
    for (int i = strlen(bin) - 1; i >= 0; --i)
    {
        if (bin[i] == '1')
            result += counter;
        counter = counter<<1;
    }

    printf("%d\n", result);
}// main

а как одной функцией даже не знаю.  Делить же надо, при переводе в двоичную. если только if поставитьsmile Я думаю эти два варианта лучше чем ваш if

Добавлено через 9 минут и 5 секунд
Цитата(mr.Anderson @  30.10.2008,  21:52 Найти цитируемый пост)
15, выводит, соответственно, 00010101.

Какую-то неправильную функцию перевода вы хотитеsmile 15 это 1111
--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
Hades
Дата 30.10.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(mr.Anderson @  30.10.2008,  21:52 Найти цитируемый пост)
получает, допустим, 15, выводит, соответственно, 00010101.

так, эта функция получает значения только в десятичном формате?
после того как вывели число в двоичном формате, надо ещё что-то сделать?

Добавлено @ 22:13
destrd, 
вы не правильно поняли
1 = 0001
5 = 0101
=> 15 - 00010101

Цитата(mr.Anderson @  30.10.2008,  16:21 Найти цитируемый пост)
 двоично-десятичное

а не шестнадцатиричное

Это сообщение отредактировал(а) Hades - 30.10.2008, 22:16
PM MAIL   Вверх
destrd
Дата 30.10.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Hades @  30.10.2008,  22:06 Найти цитируемый пост)
вы не правильно поняли

Точно. Упустил.

--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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