![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
alex7851 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.2.2012 Репутация: нет Всего: нет |
Задача такая. Есть два 32 битных беззнаковых целых, нужно сделать из них одно 64 битное за наименьшее число тактов, не прибегая ко всяким там сдвигам и сложениям.
На ум пришло:
Битхак со всеми вытекающими (gcc с желанным ключем -o3 это компилирует неверно). Мб еще как-нибудь можно? Хотя сомневаюсь. Заранее спасибо. |
|||
|
||||
casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: 1 Всего: 2 |
хотя в принципе это то же самое Это сообщение отредактировал(а) casey - 20.8.2012, 15:35 |
|||
|
||||
alex7851 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.2.2012 Репутация: нет Всего: нет |
Спасибо.
Ну, -o3 вдруг заработал, так что, что ваш код "законнее". |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Это единственный законный способ. А ваш вариант с кастованием в указатель будет работать не на всех архитектурах Порядок байтов Это сообщение отредактировал(а) leniviy - 20.8.2012, 21:13 |
|||
|
||||
Randajad |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Это называется strict aliasing, поэтому ваш код не работает.
![]() To casey: Не то же самое, это полностью валидный код. ![]() А чем сдвиги не устраивают? С 99% вероятностью они будут оптимизированы и выкинуты из кода. P.S.
Это сообщение отредактировал(а) Randajad - 20.8.2012, 21:23 |
||||||
|
|||||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
предлагаю протестировать производительность
Это сообщение отредактировал(а) leniviy - 20.8.2012, 22:34 Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
к сожалению, gcc с 99% вероятностью это не делает. |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Какая разрядность? 32? Там нет регистров в 64 бита, так что юзать сдвиги он не сможет. А на x64 сдвиги быстрее доступа к памяти.
|
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
причем тут разрядность? Ну не сможет компилятор сдвинуть одной операцией - сдвинет несколькими (псевдокод): r0 = r2 << n; r1 = r2 >> (32 - n); |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Какой operator<< для инта? В асмокоде получится shl.
На x86 32bit сдвиг на >= 32 невозможен в принципе. |
|||
|
||||
math64 |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
А чего спорить? Проверьте на примере:
Сдвиги на 31 бит используются для расширения знака. Нужно было объявить unsigned. Тогда сдвигов не будет, хотя будет ненужное сложение:
Это сообщение отредактировал(а) math64 - 30.8.2012, 14:51 |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |