2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Перевод в двоичную систему
Сообщение21.01.2011, 22:48 


10/06/09
111
Помогите найти ошибку. Вроде бы, все элементарно, но уже несколько часов убил. Требуется перевести 8-битное число из десятичной в двоичную систему счисления.

Код:
//двигаем маску по числу и вытаскиваем каждый бит
void to_binary(unsigned char c)
{
    unsigned char mask = 128; //в двоичной системе счисления 1000.0000
    for(int i = 0; i < 8; i++)
    {
        if(mask & c)
          cout<<1;
        else
          cout<<0;
        mask>>1;
    }
}

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение21.01.2011, 23:02 


15/01/11
5
а не проще было бы старым проверенным способом делить на 2 с остатком?

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение21.01.2011, 23:05 


10/06/09
111
нужно быстро. будет много переводов. около миллиарда.

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение21.01.2011, 23:19 
Заслуженный участник


04/05/09
4587
Код:
mask>>=1;


-- Пт янв 21, 2011 15:20:59 --

Если нужно быстро, то избегайте пользоваться cout. Ну или таки надо, пишите 8 символов из буффера за один раз.

-- Пт янв 21, 2011 15:22:07 --

В любом случае замените 0 и 1 на '0' и '1' в операторах вывода.

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение21.01.2011, 23:36 


10/06/09
111
Благодарю!!!! Конечно же, надо маску менять. Спасибо огромное!

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение22.01.2011, 08:23 


26/01/10
959
venco в сообщении #402903 писал(а):
Если нужно быстро, то избегайте пользоваться cout. Ну или таки надо, пишите 8 символов из буффера за один раз.

А еще лучше, забить массив строк готовых ответов из 256 возможных вариантов.
i-й элемент массива - строка, в которой записано разложение числа i. Причём такой массив можно сгенерировать без подсчёта бит, а прибавление 1 в двоичной системе прямо в строках. А если нужно ещё быстрее, то надо задачу целиком знать.

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение22.01.2011, 19:20 


22/01/11
1
Сургут
Привет! Помогите пожалуйста решить, срочно надо:
Выполните действия в системе ЭВМ, сетка 16-разрядная.
-45+12.
Спасибо! :D :D

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение22.01.2011, 21:53 
Заслуженный участник


27/04/09
28128
ttinatin в сообщении #403146 писал(а):
Выполните действия в системе ЭВМ, сетка 16-разрядная.
-45+12.
В дополнительных кодах?

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение24.01.2011, 13:49 
Аватара пользователя


30/05/09
121
Киев
На счет быстроты. Я где-то слышал пост-инкремент действует медлее, чем преиннкемент (вроде связано с тем, что возвращает копию, а не оригинал). Поэтому, якобы, лучше писать ++i;
Так же не забываем о классе памяти register (в секции инициализации цикла).

for (register int i=0; i<8; ++i)
{...}
Если значения счетчика поместить в регистровую память к нему будет быстее осуществляться доступ. Впрочем, регистровую память могут и не дать. Так что ключевое слово register скорее пожелание чем прямая инструкция.

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение24.01.2011, 16:26 


10/06/09
111
Ну, сколько я не пытался оптимизировать программы, понакидав перед каждой переменной слово register, а перед каждой функцией - inline, ничего не получалось.
У меня складывается впечатление, что современные компиляторы вообще игнорируют такие инструкции.

Насчет ++ надо подумать. Вряд ли это верно. Пользы будет больше, если передавать параметр по ссылке.

А вот совет Zealint очень кстати. Так и сделал. Отличное решение, лежащее на поверхности. Надо научиться думать, как программисты...

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение24.01.2011, 19:17 
Заслуженный участник


27/04/09
28128

(Оффтоп)

malin в сообщении #403804 писал(а):
Ну, сколько я не пытался оптимизировать программы, понакидав перед каждой переменной слово register, а перед каждой функцией - inline, ничего не получалось.
У меня складывается впечатление, что современные компиляторы вообще игнорируют такие инструкции.
Все переменные в регистры не упихать. Все функции вместо их вызова не наподставлять. Компилятор не всемогущ!

 Профиль  
                  
 
 Re: Перевод в двоичную систему
Сообщение24.01.2011, 19:38 


26/01/10
959
malin в сообщении #403804 писал(а):
А вот совет Zealint очень кстати. Так и сделал. Отличное решение, лежащее на поверхности. Надо научиться думать, как программисты...

Я даже близко не программист. Как подсказывает мой опыт работы с ними, чистые программисты как раз редко что-нибудь придумывают.

Что касается советов типа ++i или i++, я бы посоветовал автору совета хорошенько протестировать кусок кода, написанный так и так, чтобы убедиться в том, что разницы никакой нет. А вместо того, чтобы слушать чужие советы, надо попытаться понять, когда копия объекта действительно играет роль. Например, когда i - это большая структура данных (а не 4 байта), с переопределённой для неё операцией i++, в этом случае, действительно, разница (да и то, наверное, не всегда) будет заметна.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group