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