[C++] 我如何訪問C ++中的數字符號位?


Answers

那這個呢?

int sign = number < 0;

Question

我希望能夠訪問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時,我轉移?




對於整數,測試number < 0

對於浮點數,你也可以考慮零點有符號的事實。 也就是說,存在一個不同於+0.0的-0.0。 為了區分這兩個,你想使用std :: signbit




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

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



你可以使用cmath庫

#include <cmath>

並使用它

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

這個函數獲得一個float值作為輸入,一個bool值作為輸出。

true for negative
false for positive

例如

std :: cout << 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