如何在C ++中访问数字的符号位?

时间:2010-06-08 22:04:06

标签: c++ binary bitwise-operators

我希望能够在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?

9 个答案:

答案 0 :(得分:27)

这个怎么样?

int sign = number < 0;

答案 1 :(得分:14)

在C ++中右移负数的结果是实现定义的。所以,没有人知道你的-12应该在你的特定平台上进行什么样的权利转移。你认为它应该是上面的(1),而我说它可以很容易地产生全部模式,即-1。后者称为符号扩展移位。在符号扩展移位中,符号位被复制到右侧,但从未移出它的位置。

如果您感兴趣的只是符号位的值,那么请停止浪费时间尝试使用按位操作,例如移位等。只需将您的数字与0进行比较,看看它是否为负数。

答案 2 :(得分:8)

因为你正在改变有符号整数。将整数转换为unsigned:

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

答案 3 :(得分:7)

您可以使用cmath库

#include <cmath>

并像

一样使用它
std::cout << std::signbit(num);

此函数将浮点值作为输入,将bool值作为输出。

true for negative
false for positive
例如

  

std :: cout&lt;&lt;的std :: 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

答案 4 :(得分:4)

对于整数,请测试number < 0

对于浮点数,您可能还需要考虑零有符号这一事实。也就是说,存在-0.0,它与+0.0不同。要区分这两者,您需要使用std::signbit

答案 5 :(得分:2)

>>运营商正在执行arithmetic shift,该号码会保留该号码的标志。

答案 6 :(得分:1)

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

我的解决方案支持+/- 0。

答案 7 :(得分:0)

您可以执行以下操作:

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

这对于所有c ++实现都可以正常工作。

答案 8 :(得分:-1)

manage.py makemigrations