Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2014, 01:14   #1
Небожитель
Пользователь
 
Регистрация: 31.03.2011
Сообщений: 10
По умолчанию Работа с битами.

Здравствуйте. Знаю работа с битами очень оптимизирует программу. Но я не понимаю, как и что работает.

Всякие 0xF, 0xFFFFFFF0 ... сдвиги << и т.д. и т.п.

Читал статьи.. Но трудно для понимания. Кто может расписать подробно с примерами и объяснениями каждой мелочи?)
Небожитель вне форума Ответить с цитированием
Старый 23.05.2014, 08:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Кто сказал что оптимизирует?
Где ты такого начитался?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.05.2014, 08:40   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Виталик, ну что тут непонятного, вот с таким подходишь к программисту:
и оптимизируешь
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 23.05.2014 в 08:43.
raxp вне форума Ответить с цитированием
Старый 23.05.2014, 08:43   #4
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Автор наверно имел ввиду что сдвиг работает быстрее чем умножение и деление. Где-то я об этом тоже читал. Но эта оптимизация очень незначительна. Максимум что можно выиграть это несколько тактов процессора.

К примеру: 4 * 2 будет вычисляться медленнее, чем 4 << 1.

Как вы знаете (надеюсь знаете) что любое число состоит из 0 и 1 - битов.

0xF(HEX) = 00001111(BIN) = 15(DEC)
0xFF(HEX) = 11111111(BIN) = 255(DEC)
0xFFFF(HEX) = 1111111111111111(BIN) = 65535(DEC)

Сдвиги:

ПЕРЕМЕННАЯ << НА СКОЛЬКО БИТОВ СДВИГАЕМ (увеличиваем число)
ПЕРЕМЕННАЯ >> НА СКОЛЬКО БИТОВ СДВИГАЕМ (уменьшаем число)

Допустим имеется число 8. Его бинарное представление: 00001000.
Применяем операцию побитовый сдвиг влево на 2 бита: 8 << 2

Теперь смотрим по порядку, что происходит:
00001000 - исходное число (8)
00100000 - новое число (32)

Как видно биты исходного числа переместились на 2 бита вперед.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 23.05.2014 в 08:57.
kineziz вне форума Ответить с цитированием
Старый 23.05.2014, 09:25   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Кто сказал что оптимизирует?
Оптимизирует объём памяти для хранения булевых переменных. Это актуально, разве, что для ПИК-контроллеров, размер оперативки которых ограничен. Для современных ПК, это не актуально. Разве, что если кусок кода, работает ну в оооочень глубоко вложенном цикле. Да и то, в этом случае, лучше использовать вставку на АСМЕ.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.05.2014, 10:41   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и оптимизируешь
Ты прям как наш бухгалтер )))
Только он с гатлингом приходит
Цитата:
Автор наверно имел ввиду что сдвиг работает быстрее чем умножение и деление. Где-то я об этом тоже читал. Но эта оптимизация очень незначительна.
Ну смотря какая задача. Одно дело тяжелые матвычисления, тогда наверное да, стоит. а если тупо сортир пузырьком или типа того то лучше не станет.
Цитата:
Да и то, в этом случае, лучше использовать вставку на АСМЕ.
А там как правило сам оптимизатор правильный выбор делает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.05.2014, 13:59   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А там как правило сам оптимизатор правильный выбор делает.
Не всегда. За универсальность, тоже нужно платить. Функция, сдвигающая байт на два бита, сохраняет в стеке, все шесть регистров, хотя нужно созранить регистр A, выполнить две команды сдвига и восстановить регистр из стека. Вставка на АСМЕ, экономит примерно 10 операций.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.05.2014, 16:39   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Функция, сдвигающая байт на два бита, сохраняет в стеке, все шесть регистров
Чего???
Ану покажи где ты такое увидел
Не я кагбэ не оспариваю, просто не оч. верю что оптимизатор такое вытворяет при обычном сдвиге.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с битами codermoder Общие вопросы C/C++ 2 18.11.2011 06:25
работа с битами тотошкин Общие вопросы C/C++ 2 22.04.2010 12:06
Работа с битами. Masip Общие вопросы Delphi 2 13.04.2010 13:03
Работа с битами alexmikt Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 25.09.2009 13:24
Работа с битами kesha2008 Общие вопросы C/C++ 2 24.02.2009 12:05