Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Битовые операции 
:(
    Опции темы
Artemon
Дата 28.12.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



В одном из заголовочных фафлов студии определены макросы:

Код

#define LOBYTE(w)           ((BYTE)((DWORD_PTR)(w) & 0xff))
#define HIBYTE(w)           ((BYTE)((DWORD_PTR)(w) >> 8))


Почему нельзя написать так, и к каким последствиям может привести:

Код

#define LOBYTE(w)           (BYTE)w
#define HIBYTE(w)            (BYTE)(w >> 8)



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
bsa
Дата 28.12.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



попробуй для обоих вариантов:
Код
char c = 0xfe;
std::cout << (unsigned)HIBYTE(c-1) << ", " << (unsigned)LOBYTE(c-1) << std::endl;

PM   Вверх
Artemon
Дата 28.12.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Попробовал оба варианта - результат один и тотже.

Только кнечноже исправил char c = 0xfe; на unsigned short c = 0xfe;

Добавлено через 24 секунды
Windows 7 32bit + VS2005


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
bsa
Дата 28.12.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Artemon @  28.12.2011,  13:58 Найти цитируемый пост)
Только кнечноже исправил char c = 0xfe; на unsigned short c = 0xfe;

Artemon, а вот это ты зря сделал
попробуй этот код:
Код
char c = 0xfe;
std::cout << (unsigned)HIBYTE(c^1) << ", " << (unsigned)LOBYTE(c^1) << std::endl;

PM   Вверх
Artemon
Дата 28.12.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



bsa,  Так не компилится



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
arcsupport
Дата 28.12.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 24.10.2008

Репутация: нет
Всего: 2



Я бы еще в HIBYTE добавил  "& 0xff".
PM MAIL   Вверх
math64
Дата 29.12.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Приведение к байту автоматически делает & 0xFF - поэтому он не обязателен.Но скобки нужны - это макрос, он тупо делает подстановку.
Код

#define LOBYTE(w)           ((BYTE)(w))
#define HIBYTE(w)            ((BYTE)(((WORD)w) >> 8))

Если программируете на C++, можно использовать inline-функции, там лишние скобки не нужны:
Код

inline BYTE LOBYTE(WORD w) { return (BYTE)w; }
inline BYTE HIBYTE(WORD w) { return (BYTE)(w >> 8); }


PM   Вверх
Artemon
Дата 29.12.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



math64, зачем тогда M$ мделал макрос в котором как минимум не нужна операция "& 0xff"
Чем это может быть обусловлено ?


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
newbee
Дата 29.12.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(Artemon @  29.12.2011,  14:31 Найти цитируемый пост)
Чем это может быть обусловлено ? 
Это наглядней. Ну как if(x!=0) наглядней if(x). Еще этот код мог быть просто сгенерирован.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Artemon
Дата 29.12.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Ну на счет наглядности это дело вкуса я думаю, мне например нагляднее if(x)

К томуже я не понимаю, зачем делать такое приведение (DWORD_PTR)(w), мы ведь оперируем одним словом, а не двумя.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
bsa
Дата 29.12.2011, 14:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Artemon, WinAPI32 исходя из названия это 32-х разрядная библиотека. Именно столько битов в регистрах 32-х разрядного процессора. В итоге, это преобразование нужно, чтобы компилятор сгенерировал более оптимальный код под этот процессор. Так как в противном случае будут операции над неоптимальными размерами данных.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.