![]() |
|
Модераторы: bsa |
![]()
|
|
| Boguslav |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 21.12.2011 Репутация: нет Всего: нет |
Я недавно начал учить си по книге K&R. Так все круто, только никак не понимаю функций с битовыми операциями, вроде такой:
Подскажите, может есть в интернете какие-нибудь туториалы попроще с примерами и подробным описанием битовых операций |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Boguslav, ты сам виноват. Не надо было брать такую сложную и, главное, совершенно непонятную функцию (программист, который ее писал, не думал о том, что кто-то будет читать его код), хорошо, что еще скобки расставлены и не надо по таблицам приоритеты уточнять. Чтобы ее понять надо разложить на простейшие операции:
x & y - побитовое "И": 1010 & 0110 = 0010 ~x - инверсия всех битов x: ~1010 = 0101 x | y - побитовое "ИЛИ": 1010 | 0110 = 1110 x << y - сдвиг всех битов на y влево (аналог умножения x на 2 в степени y): 00001010 << 2 = 00101000 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
буквально сегодня прочитал у Карпова, что это - UB, т.к. ~0 - знаковое (значение == -1), а сдвигать знаковые нельзя. Так что пример не только "сложный и, главное, совершенно непонятный", но ещё и некорректный -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Можно сдвигать знаковые! В процессоре даже есть отдельные команды для знакового и беззнакового сдвига.
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Для выражения E1 << E2:
т.е. знаковые-таки можно, но знаковые и при этом отрицательные - нельзя. а ~0 - знаковое и отрицательное -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Можно и знаковые и без знаковые операции совершать и чтобы компилятор понимал в каком случае где и как работать нужно конкретно указывать
char unsigned char -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
math64, это процессор x86 и z80 может сдвигать знаковые, а вот ARM может? По стандарту: сдвиг отрицательного числа - это UB.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Можно ссылку на стандарт? Такая операция уже сто лет как успешно работает в наших приборах на процах PXA25x (ARM/THUMB). Используется как замена целочисленного деления на числа кратные 2м. Массивы содержат как положительные так и отрицательные значения. Результат всегда корректный. Единственное, что получается, так это ошибка на единицу по сравнению с целочисленным делением, но это так на х86 тоже. Она возникает только на отрицательных числах в дополнительном коде. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Не такая. Речь идет о сдвиге влево, это замена целочисленного умножения 'на числа кратные 2м' С99, раздел 6.5.7 Bitwise shift operators, пункт 4
С++11, раздел 5.8 Shift operators, пункт 2:
Добавлено через 2 минуты и 58 секунд
Где вы там вообще какой бы то ни было char увидели? Это сообщение отредактировал(а) xvr - 3.10.2012, 12:00 |
||||||||
|
|||||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
xvr, ну там же, следующим пунктом и о сдвиге вправо:
В общем разница между сдвигом влево и сдвигом вправо, это выбор между "behavior is undefined" и "implementation-defined" С++ стандарт как всегда, э.... "Чёток и Конкретен!" |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
> С++ стандарт как всегда
> это выбор между "behavior is undefined" и "implementation-defined" Сделал точно такой же вывод, когда читал этот раздел > Такая операция уже сто лет как успешно работает Ну Вы ж должны понимать, что UB и "успешно работает там-то и там-то" - не антонимы -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Ну bsa писал так как-будто АРМ не умеет такие операции делать. Т.е. вполне определенный проц. На счет сдвига вправо я уже не помню использовался или нет для отрицательных чисел, но думаю что использовался успешно, поскольку в отсутствии сопроцессора часто приходиться числа сдвигать, чтобы избежать потери точности в различных операциях. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Ну давай тогда другие типы подставь. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
вы знаете хоть какой-нибудь процессор, понимающий тип операндов? упомянутые не понимают, все они работают с битовым представлением, выполняя конкретную команду. лично мне неизвестны процессоры, работающие иначе. если знаете, поделитесь. другое дело, в какие инструкции компилятор превращает x<<y хотя именно в ARM для сдвига влево предусмотрена лишь одна операция LSL (и четыре для сдвига вправо) а это кто? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |