Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Копирование бита - C++

26.06.2012, 06:13. Просмотров 1993. Ответов 23
Метки нет (Все метки)

Надо упростить и оптимизировать строку
C++
1
*p=((*p&0x80)>>8)|(*p&0x80);
. Задача - скопировать (не переместить) старший бит байта в младший бит того же байта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 06:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирование бита (C++):

Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа - C++
Дано число. Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа. код частично...

Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с первого бита - C++
Ввести целое A. Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с ервогоп бита. B=1A05h.

Установка бита - C++
Дано целое число A и целое число k. Выведите число, которое получается из числа A установкой значения k-го бита равному 1.

Проверка бита - C++
Всем привет. Хотел спросить знающих людей, как можно проверить бит в байте. То есть, допустим, есть unsigned char "01010101". Какими...

Обработка бита - C++
Название Размерность Тип N 16 вход M 4 вх P ...

Обработка бита - C++
На входе даны два 8-х разарядных числа IN_0, IN_1. Если на пятом месте в IN_0 стоит 0, то поменять знак числа IN_1,(и вывести...

23
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.06.2012, 17:42 #16
Цитата Сообщение от taras atavin Посмотреть сообщение
Берём число 123 и копируем старшую цифру в младшукю. Получим 121.
Да!
А если 120, то получим 121. А если 023, то получит 020. Я об этом.
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.06.2012, 18:04  [ТС] #17
Но если из 123 выделить старшую цифру, то получается 100, если теперь её сдвинуть до младшей, то получаем 001. Если теперь всему числу присвоить 001, то оно станет 001. А надо 121. Поэтому надо ещё раз выделить все цифры, кроме младшей и сложить их со старшей, сдвинутой на место младшей. 001+120=121, что и требовалось получить. Это операции с цифрами, а присваивается целиком число.

Добавлено через 3 минуты
Вопрос: битовыми полями будет быстрее? Через них присваивается отдельная цифра.
0
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,243
Записей в блоге: 28
26.06.2012, 18:08 #18
Цитата Сообщение от taras atavin Посмотреть сообщение
Вопрос: битовыми полями будет быстрее?
Нет, не быстрее - Расскажите про new и delete в C++

Не надо оптимизировать там, где компилятор и без тебя построит оптимальный код. Вместо того, чтобы оптимизировать что-то в надежде выиграть два такта, лучше оптимизировать структуру программы и ускорить её в разы

В конце-концов, если есть вопрос "а как быстрее", то напиши оба варианта и посмотри на ассемблерную выдачу
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.06.2012, 18:18  [ТС] #19
Речь не о том, где компилятор умеет строить оптимальный код, а о том, не проглядел ли я собственную пессимизацию и не сработала ли она, не смотря на усилия компилятора. Ведь не каждую же мою глупость он может предусмотреть. Ну так так надо дать ему тот вид, где глупостей меньше и где он точно сможет построить оптимальный код. Я вот гадаю, то ли действительно сделать ифом, что подразумевает переходы, но только одну логическую операцию в каждой ветви и того две, то ли выписать в одну строчку, но тогда их набирается 3 + ещё операция сдвига, то ли дать компилу семантику всего куска в виде единственной операции, но с битовыми полями вместо собственных представлений о способе исполнения. Что из этого будет быстрее? Операция то частая, должна выполняться десятками, если не сотнями тысяч в секунду и ладно бы сама по себе, так фиг там, в довесок к графике на миллион+ полигонов в двух окнах.
0
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,243
Записей в блоге: 28
26.06.2012, 18:19 #20
В любом случае совет не оптимизировать спички является актуальным
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.06.2012, 18:23 #21
Цитата Сообщение от taras atavin Посмотреть сообщение
то ли действительно сделать ифом
Вариант без условных переходов (обычно) будет эффективнее, даже при большем количестве операций.
1
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,243
Записей в блоге: 28
26.06.2012, 18:28 #22
Цитата Сообщение от Deviaphan Посмотреть сообщение
Вариант без условных переходов (обычно) будет эффективнее, даже при большем количестве операций.
Стопудово. Условный переход - это очень плохая операция для процессоров с длинным конвейером и аппаратными механизмами предсказания перехода
1
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.06.2012, 18:33  [ТС] #23
, то, что операции с битами сами по себе медленнее из-за невозможности битовой адресации, я и так понимаю интуитивно. Но ты забываешь, что задача сопоставления стоит в рамках фиксированного формата данных, в котором флаги однозначно битовые. Так вот, исходя из того, что операции в любом случае будут битовыми, как их сделать быстрее? Это всё таки не настолько ответственное место, чтоб из-за двух бит раздувать данные до двух байта, а то и слов, к тому же чем больше места занимает массив, тем обычно тоже медленнее. Но всё таки и тормоза на пустом месте мне нафиг не нужны.
0
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,243
Записей в блоге: 28
26.06.2012, 19:35 #24
Цитата Сообщение от taras atavin Посмотреть сообщение
Так вот, исходя из того, что операции в любом случае будут битовыми, как их сделать быстрее?
Я уже писал - пофигу как делать. Хоть так, хоть эдак у тебя код будет более-менее одинаковый
1
26.06.2012, 19:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 19:35
Привет! Вот еще темы с ответами:

Замена бита единицей - C++
Здравствуйте, помогите пожалуйста решить задачку. Нужно: ввести последовательность из 8 целых чисел. В каждом втором числе заменить (...

Наличие бита в байте - C++
Подскажите, правильна ли реализация проверки наличия бита в байте #define MARK 0x02 .. if (dataRead & MARK) { ...

Как проверить 2 бита? - C++
BorlandC++3.0 MS-DOS, надо проверить 5й бит равен 1, а 6й бит = 0, не получается их проверить в одном IF, если проверяю по отдельности, то...

Проверка бита на единицу - C++
Подскажите, корректно ли такое сравнение if((paramData &= 0x80) == 1) // проверка на наличие единицы(1) в 8-ом бите данного байта длины...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru