Как я могу получить доступ к знаковому биту числа в C++?

Я хочу смочь получить доступ к знаковому биту числа в C++. Мой текущий код выглядит примерно так:

int sign bit = number >> 31;

Это, кажется, работает, давая мне 0 для положительных чисел и -1 для отрицательных чисел. Однако я не вижу, как я добираюсь -1 для отрицательных чисел: если 12

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100

затем-12

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0011

и смещение его 31 бит сделало бы

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

который равняется 1, не-1, итак, почему я добираюсь-1, когда я смещаю его?

10
задан 8 June 2010 в 22:04
поделиться

4 ответа

Результат сдвига отрицательного числа вправо в C ++ определяется реализацией. Итак, никто не знает, что смещение вправо вашего -12 должно иметь на вашей конкретной платформе. Вы думаете, что он должен сделать то же самое ( 1 ), в то время как я говорю, что он может легко создать шаблон «все единицы», который равен -1 . Последнее называется сдвигом со сдвигом по знаку. При сдвиге с расширенным знаком знаковый бит копируется вправо, но никогда не сдвигается со своего места.

Если все, что вас интересует, это значение знакового бита, прекратите тратить время на побитовые операции, такие как сдвиги и т. Д. Просто сравните свое число с 0 и посмотрите, отрицательное оно или нет.

15
ответ дан 3 December 2019 в 13:15
поделиться

Что насчет этого?

int sign = number <0;

27
ответ дан 3 December 2019 в 13:15
поделиться

Потому что вы сдвигаете знаковое целое число. Приведите целое число к беззнаковому:

int sign_bit = ((unsigned int)number) >> 31;
8
ответ дан 3 December 2019 в 13:15
поделиться

Оператор >> выполняет арифметический сдвиг ], который сохраняет знак числа.

2
ответ дан 3 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: