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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 00:46   #1
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию Непонятный код

Код:
#define HEX__(n) 0x##n##LU
 
#define B8__(x) ((x&0x0000000FLU)?1:0)\
               +((x&0x000000F0LU)?2:0)\
              +((x&0x00000F00LU)?4:0)\
               +((x&0x0000F000LU)?8:0)\
               +((x&0x000F0000LU)?16:0)\
               +((x&0x00F00000LU)?32:0)\
               +((x&0x0F000000LU)?64:0)\
               +((x&0xF0000000LU)?128:0)
В интернете нашел код, который, насколько я понял, позволяет записывать числа в 16-чной и 2-чной системе исчисления.
1) Что значит LU?
2) (x&0x0000000FLU) Что это значит? Мы смотрим состояние бит, начиная с младших и если он не равен 0 то присваиваем соответствующее значение?
qwertyk вне форума Ответить с цитированием
Старый 06.02.2013, 01:21   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
1) Что значит LU?
Long Unsigned. Явное задание типа нумерала.
Цитата:
(x&0x0000000FLU) Что это значит?
Логическое И x и беззнакового длинного целого 15. В качестве условия в тернарном операторе, при условии, что x - целое, данное выражение равно true тогда и только тогда, когда из четырёх младших двоичных разрядов x хотя бы один не равен 0.
Abstraction вне форума Ответить с цитированием
Старый 06.02.2013, 01:57   #3
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Можно вместо 0x0000000F писать 0x00000001 (вместо 0x000000F0 -0x00000010 и т.д.), результат по сути должен остаться тем же?
qwertyk вне форума Ответить с цитированием
Старый 06.02.2013, 02:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
результат по сути должен остаться тем же?
у вас по битам вместо 1111(15), выйдет 0001(1).
как вы думаете изменится ли?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.02.2013, 02:28   #5
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у вас по битам вместо 1111(15), выйдет 0001(1).
как вы думаете изменится ли?
Там есть еще строчка
#define B8(d) ((unsigned char)B8__(HEX__(d))).
То есть можно записывать число в двоичном виде, например В8(10101001) и это должно после преобразований равняться десятичному числу. Но так как максимальное дисятичное число = 256 (определено в макросе define B8__(x)), то какая разница что мы введем восьми-разрядное В8(11111111) или 10-ти разрядное В8(1111111111) число, результом после побитового И будет 256, следовательно можно вместо 0x0000000F писать 0x00000001. Или может я ошибаюсь?
qwertyk вне форума Ответить с цитированием
Старый 06.02.2013, 02:45   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

судя по макросу вводить число надо как бы в хексе.
например:
Код:
0x01001000
причем, у вместо единиц можно применить любое шестнадцатеричное число.
то есть макрос примет и
Код:
0x0F00A000
с тем же результатом.


-----------------------------------добавленно
а нет, итоговый макрос сам добавляет эти 0x и тп нужное для верной работы.(макросом HEX__)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 06.02.2013 в 02:47.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.02.2013, 02:48   #7
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Зачем приводить B8__(HEX__(d) к unsigned char?
qwertyk вне форума Ответить с цитированием
Старый 06.02.2013, 02:50   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

чтоб результат макроса был строго определенного типа.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.02.2013, 03:02   #9
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Вот мы ввели В8(00000010) дальше это число подставляется в макрос HEX__(n), и что дальше? Если записать 0х00000010, то это уже не то число которое мы ввели в начале.
qwertyk вне форума Ответить с цитированием
Старый 06.02.2013, 03:11   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Вот мы ввели В8(00000010) дальше это число подставляется в макрос HEX__(n), и что дальше? Если записать 0х00000010, то это уже не то число которое мы ввели в начале.
по проходам препроцессора:
Код:
B8(00000010)
Код:
(unsigned char)B8__(HEX__(00000010))
Код:
(unsigned char)B8__(0x00000010LU)
Код:
(unsigned char)((0x00000010LU&0x0000000FLU)?1:0)
               +((0x00000010LU&0x000000F0LU)?2:0)
              +((0x00000010LU&0x00000F00LU)?4:0)
               +((0x00000010LU&0x0000F000LU)?8:0)
               +((0x00000010LU&0x000F0000LU)?16:0)
               +((0x00000010LU&0x00F00000LU)?32:0)
               +((0x00000010LU&0x0F000000LU)?64:0)
               +((0x00000010LU&0xF0000000LU)?128:0)
далее компилятор вычисляет константы.
Код:
(unsigned char)0
               +2
              +0
               +0
               +0
               +0
               +0
               +0
итог:
Код:
(unsigned char)2
получили то что хотели.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятный код artem611 Помощь студентам 2 11.04.2012 00:43
C# непонятный код raok Помощь студентам 4 21.05.2011 14:15
Непонятный код. Вадим Буренков Общие вопросы Delphi 9 18.08.2010 17:15
непонятный код Kostua Помощь студентам 5 27.04.2008 18:17