Понимание и идентификация подписанных номеров - PullRequest
0 голосов
/ 28 января 2020

Я новичок в этом вопросе и пытаюсь понять, как 0xFFFFFFF & 0x00000001 могут иметь одинаковый знак, а 0x0000001 и 0x12345678 - разные. Основываясь на моем понимании, шестнадцатеричные цифры, у которых самый значимый бит между 0-7, являются положительными, а 8-F - отрицательными.

Для дальнейшего контекста, вот что я пытался понять:

Вопрос: Выполните функцию C, которая выполняет операции и отвечает требованиям, указанным в комментариях.

Комментарии:

    /*
    * diffSign – return 1 if x and y have different signs 
    * Examples: diffSign(0xFFFFFFF, 0x00000001) = 0
    * diffSign(0x0000001, 0x12345678) = 1
    * Legal ops: & | ^ ~ << >>
    * 1-byte const (0x00 to 0xFF)
    */

Ответ:

     int diffSign(int x, int y) {
        return ((x >> 31) & 0x1) ^ ((y >> 31) & 0x1);
    }

Если возможно, я также был бы очень признателен за разъяснения о том, как & 0x1 поможет мне идентифицировать знак! Это кажется излишним, и я не слишком уверен в значении этого в уравнении.

1 Ответ

0 голосов
/ 28 января 2020

Если вы посмотрите внимательно, это имеет смысл, просто вы не видите, что самый старший байт 0xFFFFFFF на самом деле равен 0, потому что есть 7 F.

0xFFFFFFF = 0x0FFF FFFF

который для 32-разрядного целого представляет положительное число.

Однако 0x0000001 и 0x12345678 также имеют одинаковый знак. Потому что то, что имеет значение, является самым значительным битом. Вы правы, что числа с самым значимым байтом от 0 до 7 положительны, а 8-F отрицательны. Комментарий в функции неправильный.

Код, тем не менее, правильный, потому что он выполняет 31 сдвиг вправо, оставляя только самый значимый бит для каждого из аргументов (знаковый бит каждого аргумента) и делает XOR, который возвращает true, только если оба не совпадают.

...