Я хочу смочь получить доступ к знаковому биту числа в 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, когда я смещаю его?
Результат сдвига отрицательного числа вправо в C ++ определяется реализацией. Итак, никто не знает, что смещение вправо вашего -12
должно иметь на вашей конкретной платформе. Вы думаете, что он должен сделать то же самое ( 1
), в то время как я говорю, что он может легко создать шаблон «все единицы», который равен -1
. Последнее называется сдвигом со сдвигом по знаку. При сдвиге с расширенным знаком знаковый бит копируется вправо, но никогда не сдвигается со своего места.
Если все, что вас интересует, это значение знакового бита, прекратите тратить время на побитовые операции, такие как сдвиги и т. Д. Просто сравните свое число с 0 и посмотрите, отрицательное оно или нет.
Потому что вы сдвигаете знаковое целое число. Приведите целое число к беззнаковому:
int sign_bit = ((unsigned int)number) >> 31;