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

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

Войти
Регистрация
Восстановить пароль
 
kykyry3a
1 / 1 / 0
Регистрация: 22.01.2013
Сообщений: 20
#1

Непонятный код - C++

06.02.2013, 00:44. Просмотров 536. Ответов 11
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
#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-чной системе исчисления.
2) Что значит LU?
3) (x&0x0000000FLU) Что это значит? Мы смотрим состояние бит, начиная с младших и если он не равен 0 то присваиваем соответствующее значение?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 00:44     Непонятный код
Посмотрите здесь:

C++ Непонятный Код
C++ Непонятный вывод
Непонятный typedef C++
C++ Непонятный синтаксис
C++ Непонятный синтаксис.
C++ Непонятный пример из книги
Непонятный код? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
06.02.2013, 00:51     Непонятный код #2
Цитата Сообщение от kykyry3a Посмотреть сообщение
x&0x0000000FLU
Как я понял:
x - переменная, представляющее из себя число
& - битовая операция 'И'
0x0000000F - шестнадцатиричное число 15, а LU - то что это число типа unsigned long
kykyry3a
1 / 1 / 0
Регистрация: 22.01.2013
Сообщений: 20
06.02.2013, 01:04  [ТС]     Непонятный код #3
Цитата Сообщение от kykyry3a Посмотреть сообщение
#define HEX__(n) 0x##n##LU
А что значит эта строчка, вроде бы ## применяются для склеивания?
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
06.02.2013, 01:11     Непонятный код #4
Цитата Сообщение от kykyry3a Посмотреть сообщение
А что значит эта строчка, вроде бы ## применяются для склеивания?
Да, для конкатенации двух лексем
kykyry3a
1 / 1 / 0
Регистрация: 22.01.2013
Сообщений: 20
06.02.2013, 01:55  [ТС]     Непонятный код #5
Там еще строчка есть
C++
1
#define B8(d) ((unsigned char)B8__(HEX__(d)))
.
Зачем приводить B8__(HEX__(d) к unsigned char? Можно вместо 0x0000000F писать 0x00000001 (вместо 0x000000F0 -0x00000010 и т.д.), результат по сути должен остаться тем же?
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
06.02.2013, 12:29     Непонятный код #6
Цитата Сообщение от kykyry3a Посмотреть сообщение
Можно вместо 0x0000000F писать 0x00000001 (вместо 0x000000F0 -0x00000010 и т.д.), результат по сути должен остаться тем же?
Конечно будет одним и тем же в случае с макросом B8. Только в случае с 0x0000000F вы можете писать не только 1010101, но и 2020202, т.е. любая цифра не равная нулю будет считаться за 1. Но в случае непосредтсвенного применения B8__ применение '1' вместо 'F' выдается некорректный результат.
Цитата Сообщение от kykyry3a Посмотреть сообщение
Зачем приводить B8__(HEX__(d) к unsigned char?
Я посмотрел как работатет B8__ (быстро я на работе=) ), в итоге максимум что из него выжить - число 255. Поэтому может и приводят к unsigned char, и по ходу дела там, где все эти макросы применяют больше не нужно.
kykyry3a
1 / 1 / 0
Регистрация: 22.01.2013
Сообщений: 20
07.02.2013, 21:27  [ТС]     Непонятный код #7
C++
1
2
3
4
5
#define qwe(x) {#x; x##1##2##3;}
................................................................
char *ch;
ch=qwe(0);//E2188 Expression syntax
................................................................
Хочу чтобы вывел строку "0123", но показывает ошибку почему?
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
08.02.2013, 00:19     Непонятный код #8
Так, если не ошибаюсь препроцессорв вот это:
C++
1
ch=qwe(0);
превратит, в вот это:
C++
1
ch= {"0"; 0123;};
И как такая конструкция сможет работать?

Добавлено через 8 минут
Если не ошибаюсь, следующим способом можно инициализировать только массивы:
C++
1
char k[] = {'4', '3', 'a', '\0' };
Заметь следующее:
1) между элементами запятая, а не точка с запятой
2) каждый элемент соответствует типу элемента массива - char - один байт, либо символы:
C++
1
char k[] = {'g', 'e', 't', '\0' };
либо числа от -127 до 128:
C++
1
char k[] = {1, 2, 3, 5 };
3) '\0', '\n', '\t' и т.п.- это управляющие символы, они в действительности занимают один байт, такие конструкции, как '123' - неверны для char

А у тебя в добавок не массив, а указатель. Говоря о массиве
C++
1
char m[10]
можно сказать, что m - указатель, но указатель не на массив, а на первый элемент. Так что ch - это не массив!
kykyry3a
1 / 1 / 0
Регистрация: 22.01.2013
Сообщений: 20
08.02.2013, 01:27  [ТС]     Непонятный код #9
StasGamilton, спасибо. Переписал вот так:
C++
1
#define qwe(x)  #x##"1"##"2"##"3"
Можно еще и так:
C++
1
2
#define qwe_(n) #n
#define qwe(x)  qwe_(x)##"1"##"2"##"3"
Скорость выполняния 1-го и 2-го варианта будет разная?

Добавлено через 24 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
#define B8(x)     ((x&128)?"1":"0")\
                 ##((x&64)?"1":"0")\
                 ##((x&32)?"1":"0")\
                 ##((x&16)?"1":"0")\
                 ##((x&8)?"1":"0")\
                 ##((x&4)?"1":"0")\
                 ##((x&2)?"1":"0")\
                 ##((x&1)?"1":"0")
..........................................................
char *ch;
ch=В8(3);//E2314 Call of nonfunction,
..........................................................
Макрос должен переводить из 10-ой в 2-ую систему исчисления. Но не работает, пишет ошибку как это исправить?
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
08.02.2013, 02:08     Непонятный код #10
Цитата Сообщение от kykyry3a Посмотреть сообщение
Скорость выполняния 1-го и 2-го варианта будет разная?
Если про скорость выполнения программы - то будет одинаковая, так как препроцессор даст один и тот же результат. Правда у меня возникли проблемы с этими примерами, компилятор ругается.

Цитата Сообщение от kykyry3a Посмотреть сообщение
Макрос должен переводить из 10-ой в 2-ую систему исчисления. Но не работает, пишет ошибку как это исправить?
Одно из использований директивы #define заключается в том, чтобы во время работы препроцессора она заменила макросы тем кодом, который справа от него. Т.е. не выполняется функция, а сначала этот код вставляется в нужное место, а потом производиться компиляция. Т.е. во время работы препроцессора не генерируется бинарники, а изменяется текст программы. Смотрим дальше, я еще повторюсь - "##" - это конкатенация лексем. Т.е. вместо
C++
1
ch=В8(3);
у тебя эта строчка после препроцессора будет выглядить так:
C++
1
ch=((3&128)?"1":"0")((3&64)?"1":"0")((3&32)?"1":"0")\((3&16)?"1":"0")\((3&8)?"1":"0")\((3&4)?"1":"0")((3&2)?"1":"0")((3&1)?"1":"0");
Т.е. бесмыслица.
kykyry3a
1 / 1 / 0
Регистрация: 22.01.2013
Сообщений: 20
08.02.2013, 02:39  [ТС]     Непонятный код #11
А как правильно написать? Что бы склеивались нолики/еденички.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2013, 21:41     Непонятный код
Еще ссылки по теме:

C++. Непонятный символ C++
Код выдает непонятный результат -1.#IND C++
Непонятный цикл C++
Непонятный код и функция FindWindow C++
Непонятный возвращаемый тип C++

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

Или воспользуйтесь поиском по форуму:
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
08.02.2013, 21:41     Непонятный код #12
Цитата Сообщение от kykyry3a Посмотреть сообщение
А как правильно написать? Что бы склеивались нолики/еденички.
Напишите сперва маленькую программку, которая склеивает нолики и единички без макросов. Посмотрите на нее внимательно и попробуйте вывести от туда нужный макрос.
Yandex
Объявления
08.02.2013, 21:41     Непонятный код
Ответ Создать тему
Опции темы

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