C / C ++ Проверьте, установлен ли бит 31 в беззнаковом int

Я пытаюсь проверить и посмотреть, установлен ли бит в неподписанном int. Я не уверен, как я могу это сделать, но я предполагаю, что это будет что-то вроде этого. Я пытаюсь сделать инструкцию cdq в C ++ (но функцию)

Вот что у меня есть

unsigned int cdq(unsigned int eax)
{
unsigned int edx = 0;

if( (eax >> 31) & 1 ) { edx = 0xFFFFFFFF; }
return edx
}

Когда я использую функцию со следующими значениями:

бит 31 cdq (0x12345678) установлен (1), поэтому он должен возвращать (без знака int) -1
бит 31 cdq (0x01) не установлен (0), поэтому он должен возвращать 0

Проблема в том, что он всегда возвращает 0, и я не уверен, почему

2

Решение

бит 31 (0x12345678) установлен (1)

Нет, это не так … старший бит установлен как бит 28:

    1    2    3    4    5    6    7    8
0001 0010 0011 0100 0101 0110 0111 1000
^  ^
|  |
31  28

Ваш код должен работать, но я бы использовал

if( eax & (1U << 31) ) edx = 0xFFFFFFFF;

так как он немного более прямой и смещает константу, а не переменную, поэтому он меньше работает во время выполнения (хотя оптимизирующий компилятор должен генерировать одинаковый код для обоих).

На самом деле я бы написал что-то вроде

int cdq(int eax)
{
return eax < 0? -1 : 0;
}

Кстати, ваш код на самом деле не реализует cdq, потому что ваши переменные eax и edx не являются аппаратными регистрами eax и edx. И на самом деле не очень хорошая идея реплицировать инструкции ASM как функции C, так или иначе … C имеет свои собственные функции для выполнения таких действий, например,

int32_t foo = -0x12345678;
int64_t bar = (int64_t)foo;
6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector