C ++ Int манипулирование битами 2UL = 10UL? - PullRequest
0 голосов
/ 19 февраля 2012

У меня быстрый вопрос.

Я какое-то время играл с битовыми манипуляциями в c / c ++ и недавно обнаружил, что когда я сравниваю 2UL и 10UL с обычным целым без знака, они, похоже, возвращают один и тот же бит.

Например,

#define JUMP 2UL
#define FALL 10UL

unsigned int flags = 0UL;
this->flags |= FALL;

//this returns true
this->is(JUMP);

bool Player::is(const unsigned long &isThis)
{
return ((this->flags & isThis) == isThis);
}

Пожалуйста, подтвердите, если 2U равно 10U, и если да, то как мне обойти это, если мне нужно более 8 (?) Флагов в одном целом без знака.

С уважением,

-Markus

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Конечно.10ul - это 1010 в двоичном формате, а 2 - это 10. Поэтому выполнение x |= 10 также устанавливает второй бит.

Вы, вероятно, хотели использовать 0x10 и 0x2 в качестве флагов.Они будут работать так, как вы ожидаете.

В качестве отступления: одна цифра в шестнадцатеричной записи представляет 4 бита, а не 8.

1 голос
/ 19 февраля 2012

Десятичное число 2 в двоичном виде - 0010, тогда как десятичное 10 - двоичное 1010. Если вы поразрядно - и их (2 & 10), то получается двоичное число 0010 или десятичное 2. Таким образом, 10 & 2 действительно равно 2. Возможно, ваше намерение проверить на 1ul << 2 и 1ul << 10, которые будут битами № 2 и 10 соответственно. Или, может быть, вы хотели использовать шестнадцатеричное 10 (десятичное 16, двоичное 10000), которое обозначается как 0x10.

1 голос
/ 19 февраля 2012
JUMP, 2:  0010
FALL, 10: 1010

FALL & JUMP = JUMP = 0010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...