Использования hexidecimal в коде

236
06 февраля 2019, 05:10

Какой особый смысл в том, чтобы использовать hexidecimal, для определения значения переменных?

#define SPAWNFLAG_NOT_EASY          0x00000100
#define SPAWNFLAG_NOT_MEDIUM        0x00000200
#define SPAWNFLAG_NOT_HARD          0x00000400
#define SPAWNFLAG_NOT_DEATHMATCH    0x00000800
#define SPAWNFLAG_NOT_COOP          0x00001000

Это как-то ускоряет работу на машинном уровне или может быть имеет какие либо плюсы? Довольно часто вижу такой код, особенно в игровых проектах. Почему именно hexidecimal? Почему не любой другой способ?

Answer 1

Отдельные биты удобно задавать именно шестнадцатиричными значениями, поскольку они напрямую транслируются в двоичные, но при этом гораздо компактнее. Сразу видно, что SPAWNFLAG_NOT_EASY задает бит 8, а, скажем, SPAWNFLAG_NOT_COOP - бит 12. Однако ничто не мешает то же самое записать десятичными константами:

#define SPAWNFLAG_NOT_EASY          256
#define SPAWNFLAG_NOT_MEDIUM        512
#define SPAWNFLAG_NOT_HARD          1024
#define SPAWNFLAG_NOT_DEATHMATCH    2048
#define SPAWNFLAG_NOT_COOP          4096

В принципе, наметанный глаз сразу выделяет степени двойки, но все же это не так наглядно и позиции конкретных битов не так очевидны.

В C++14 появились двоичные литералы и возможность разделения групп апострофами, так что ваш пример в нем можно записать и так:

#define SPAWNFLAG_NOT_EASY          0b0000'0001'0000'0000
#define SPAWNFLAG_NOT_MEDIUM        0b0000'0010'0000'0000
#define SPAWNFLAG_NOT_HARD          0b0000'0100'0000'0000
#define SPAWNFLAG_NOT_DEATHMATCH    0b0000'1000'0000'0000
#define SPAWNFLAG_NOT_COOP          0b0001'0000'0000'0000

Возможно, такая форма получит широкое применение, когда, наконец, вымрет поколение, привыкшее к шестнадцатиричным цифрам.

READ ALSO
есть ли различия в подчёркиваниях? если да, то какие?

есть ли различия в подчёркиваниях? если да, то какие?

в чём различие в __cdecl и _cdecl или __fastcall и _fastcall или __asm и _asm и тд?

297
ошибка при чтении файла getline [c++] MS VS2010 [закрыт]

ошибка при чтении файла getline [c++] MS VS2010 [закрыт]

Появляется ошибка при чтении файла на getline в MS VS2010 появляется ошибка на while( ingetline(buf, 1024) ){ при чтении пустой строки, а именно при чтении символов...

276
std::conditional параметр в конструкторе

std::conditional параметр в конструкторе

Пытаюсь написать класс, реализующий одновременно константный и неконстантый итератор как показано здесь

238
При вводе чисел не меняется значение выражения

При вводе чисел не меняется значение выражения

Когда ввожу разные значения с клавиатуры, значения не меняютсяКак испраить данную ошибку?

269