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

макросы - C++

Восстановить пароль Регистрация
 
truktarushkin
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 10
27.05.2012, 20:08     макросы #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define EMPTY        0x00
#define ILLEGAL      0xF0
#define B_PRIVATE  0x01           // 1 бит - наличие
#define W_PRIVATE 0x03           // 2 бита - цвет
#define B_QUEEN     0x05           // 3 бита - дамка
#define W_QUEEN    0x07           // 4 бита - выбрана
 
#define AB_PRIVATE  0x09
#define AW_PRIVATE 0x0B
#define AB_QUEEN    0x0D
#define AW_QUEEN   0x0F
......................................................
bool Cell::IsEmpty(void)
{ if (Data==EMPTY) return true; else return false; }
 
bool Cell::Selected(void)
{ if (Data&0x08 && Data&0x01) return true; else return false; }
 
bool Cell::IsQueen(void)
{ if (Data&0x04 && Data&0x01) return true; else return false; }
 
 
bool Cell::IsWhite(void)
{ if (Data&0x02 && Data&0x01) return true; else return false; }
 
bool Cell::IsBlack(void)
{ if (!(Data&0x02) && Data&0x01) return true; else return false; }
 
void Cell::Select(void)
{ Data = Data | 0x08; }
 
void Cell::Deselect(void)
{ Data = Data & 0xf7; }
EMPTY соответствует пустой клетке на доске для игры в шашки
ILLEGAL клетке, на которой шашка находиться не может
B_PRIVATE чёрная шашка
W_PRIVATE белая
B_QUEEN чёрная дамка
W_QUEEN белая
AB_PRIVATE белая шашка выделена
AW_PRIVATE черная выделена
AB_QUEEN белая дамка выделена
AW_QUEEN чёрная
Data хранит в себе эти значения
как работают функции? не могу разобраться с шестнадцатеричными цифрами и комментарием "1 бит - наличие, 2 бита - цвет, 3 бита - дамка, 4 бита - выбрана"

Добавлено через 32 минуты
Апдэйт
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2012, 20:08     макросы
Посмотрите здесь:

Макросы C++
макросы C++
C++ Макросы
Макросы C++
C++ Предопределённые макросы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
27.05.2012, 20:53     макросы #2
как работают функции?
По битово.

0116 = 012
0316 = 112
итд.

Калькулятор в помощь...

Каждый бит в числе отвечает за наличие/отсутствие чего-то.
truktarushkin
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 10
28.05.2012, 00:29  [ТС]     макросы #3
это я понимаю, почему, например, в функции Cell::IsQueen(void) исп-ся "Data&0x04", в макросе такой цифры нет же. вот этот момент мне не понятен
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
28.05.2012, 00:42     макросы #4
416= 1002

Data&0x04 проверяет равен ли 3-й бит в числе единице

516= 1012

а третий бит у нас отвечает за дамку (как написано в коментарии макросов)

Добавлено через 8 минут
Константы можно было бы переписать в С++ стиле, и ф-ции записать иначе
C++
1
2
3
4
5
6
7
8
9
const int b_queen= 0x05;
const int w_queen= 0x07;
 
 
bool Cell::IsQueen(void)
{
if (Data==b_queen || Data==w_queen) return true; 
return false; 
}
truktarushkin
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 10
28.05.2012, 01:19  [ТС]     макросы #5
вот такое объяснение мне и нужно было, спасибо!
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
28.05.2012, 02:57     макросы #6
Комментарии в исходном посте в строках 5-8 неудачные. Во-первых они не относятся к этим строкам, а во-вторых они кривоваты.

Можно было бы сделать более осмысленно, что-нибудь вроде
C++
1
2
3
4
5
6
7
8
9
#define IS_PRESENT   0x01           // 0-й бит - наличие
#define IS_WHITE     0x02           // 1-й бит - цвет
#define IS_QUEEN     0x04           // 2-й бит - дамка
#define IS_SELECTED  0x08           // 3-й бит - выбрана
 
#define B_PRIVATE  IS_PRESENT
#define W_PRIVATE  (IS_PRESENT | IS_WHITE)
#define B_QUEEN    (IS_PRESENT | IS_QUEEN)
#define W_QUEEN    (IS_PRESENT | IS_WHITE | IS_QUEEN)
Тогда бы и функции читались бы легче. Например
C++
1
2
3
4
5
bool Cell::Selected(void)
{ if (Data & IS_SELECTED && Data & IS_PRESENT) return true; else return false; }
 
bool Cell::IsQueen(void)
{ if (Data & IS_QUEEN && Data & IS_PRESENT) return true; else return false; }
Yandex
Объявления
28.05.2012, 02:57     макросы
Ответ Создать тему
Опции темы

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