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

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

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, когда меняю его?

Ответ 1

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

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

Ответ 2

Как насчет этого?

int sign = number < 0;

Ответ 3

Потому что вы меняете целое число со знаком. Вставьте целое число в unsigned:

int sign_bit = ((unsigned int)number) >> 31;

Ответ 4

Вы можете использовать библиотеку cmath

#include <cmath>

и используйте его как

std::cout << std::signbit(num);

Эта функция получает значение float как входное и значение bool в качестве вывода.

true for negative
false for positive

например

std:: cout < станд:: signbit (1);

даст вам 0 в качестве вывода (false)

но при использовании этой функции вы должны быть осторожны с нулем

std::cout << std::signbit(-0.0);  // 512 (true)
std::cout << std::signbit(+0.0);  // 0   (false)

Выходные данные этих строк не совпадают.

Чтобы устранить эту проблему, вы можете использовать:

float x = +0.01;
std::cout << (x >= 0 ? (x == 0 ? 0 : 1) : -1);

которые дают:

 0 for 0
 1 for positive
-1 for negative

Ответ 5

Для целых чисел test number < 0.

Для чисел с плавающей запятой вы также можете принять во внимание тот факт, что ноль имеет знак. То есть существует -0.0, отличное от +0.0. Чтобы отличить эти два, вы хотите использовать std:: signbit.

Ответ 7

bool signbit(double x)
{
    return 1.0/x != 1.0/fabs(x);
}

Мое решение, которое поддерживает +/- 0.

Ответ 8

Вы можете сделать следующее:

int t1 = -12;
unsigned int t2 = t1;
t2 = t2>>31;
cout<<t2;

Это будет хорошо работать для всех реализаций c++.

Ответ 9

bool signbit(double x)
{
    return (__int64)x & 0x8000000000000000LL != 0LL;
}

bool signbit(float x)
{
    return (__int32)x & 0x80000000 != 0;
}