2014 dxdy logo

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

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




 
 Перевод в двоичную систему
Сообщение21.01.2011, 22:48 
Помогите найти ошибку. Вроде бы, все элементарно, но уже несколько часов убил. Требуется перевести 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 
а не проще было бы старым проверенным способом делить на 2 с остатком?

 
 
 
 Re: Перевод в двоичную систему
Сообщение21.01.2011, 23:05 
нужно быстро. будет много переводов. около миллиарда.

 
 
 
 Re: Перевод в двоичную систему
Сообщение21.01.2011, 23:19 
Код:
mask>>=1;


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

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

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

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

 
 
 
 Re: Перевод в двоичную систему
Сообщение21.01.2011, 23:36 
Благодарю!!!! Конечно же, надо маску менять. Спасибо огромное!

 
 
 
 Re: Перевод в двоичную систему
Сообщение22.01.2011, 08:23 
venco в сообщении #402903 писал(а):
Если нужно быстро, то избегайте пользоваться cout. Ну или таки надо, пишите 8 символов из буффера за один раз.

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

 
 
 
 Re: Перевод в двоичную систему
Сообщение22.01.2011, 19:20 
Привет! Помогите пожалуйста решить, срочно надо:
Выполните действия в системе ЭВМ, сетка 16-разрядная.
-45+12.
Спасибо! :D :D

 
 
 
 Re: Перевод в двоичную систему
Сообщение22.01.2011, 21:53 
ttinatin в сообщении #403146 писал(а):
Выполните действия в системе ЭВМ, сетка 16-разрядная.
-45+12.
В дополнительных кодах?

 
 
 
 Re: Перевод в двоичную систему
Сообщение24.01.2011, 13:49 
Аватара пользователя
На счет быстроты. Я где-то слышал пост-инкремент действует медлее, чем преиннкемент (вроде связано с тем, что возвращает копию, а не оригинал). Поэтому, якобы, лучше писать ++i;
Так же не забываем о классе памяти register (в секции инициализации цикла).

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

 
 
 
 Re: Перевод в двоичную систему
Сообщение24.01.2011, 16:26 
Ну, сколько я не пытался оптимизировать программы, понакидав перед каждой переменной слово register, а перед каждой функцией - inline, ничего не получалось.
У меня складывается впечатление, что современные компиляторы вообще игнорируют такие инструкции.

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

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

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

(Оффтоп)

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

 
 
 
 Re: Перевод в двоичную систему
Сообщение24.01.2011, 19:38 
malin в сообщении #403804 писал(а):
А вот совет Zealint очень кстати. Так и сделал. Отличное решение, лежащее на поверхности. Надо научиться думать, как программисты...

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

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

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group