Comment puis-je accéder à un bit de signe d'un nombre en C++?
Je veux être en mesure d'accéder le bit de signe d'un nombre en C++. Mon code ressemble à ceci:
int sign bit = number >> 31;
Semble-t-il, en me donnant 0
pour les nombres positifs et -1
pour les nombres négatifs. Cependant, je ne vois pas comment je obtenir -1
pour les nombres négatifs: si 12 est
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100
puis -12 est
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0011
et déplacement 31 bits ferait
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
qui est 1, pas de -1, alors pourquoi puis-je obtenir -1 quand je shift?
double possible de Absolu Guide du Débutant pour le Décalage de Bits?
int sign_bit = (int)(nombre > 0);
Pour en complément à deux (qui la plupart des systèmes modernes d'utilisation), votre -12 est faux. Elle devrait mettre fin 0100.
int sign_bit = (int)(nombre > 0);
Pour en complément à deux (qui la plupart des systèmes modernes d'utilisation), votre -12 est faux. Elle devrait mettre fin 0100.
OriginalL'auteur | 2010-06-08
Vous devez vous connecter pour publier un commentaire.
Le résultat de droit-la vitesse d'un nombre négatif en C++ est mise en œuvre définies. Donc, on ne sait pas ce droit-shifting votre
-12
sur votre plate-forme spécifique. Vous pensez qu'elle devrait faire ci-dessus (1
), alors que je dis qu'il peut facilement produire l'ensemble-modèle, qui est-1
. Ce dernier est appelé signe étendu de changer. En signe étendu déplaçant le bit de signe est copié vers la droite, mais jamais déplacé hors de sa place.Si tout ce que vous êtes intéressé est la valeur du bit de signe, puis arrêter de perdre du temps à essayer d'utiliser des opérations bit à bit, comme les quarts de travail, etc. Il suffit de comparer votre nombre de 0 et de voir si elle est négative ou non.
Cela ne fait pas de distinction -0.0 +0.0. Vous devez accéder au bit de signe. Voir Jean de la réponse.
Basée sur le texte de la question, il me semble se poser sur les entiers .
Oh!! Je me suis trompé par les autres réponses et n'a pas lu attentivement.
Je sais que c'est un vieux sujet, mais la dernière situation être évité par la bit-à-bit & 1?
OriginalL'auteur AnT
Quoi à ce sujet?
int sign = number < 0;
OriginalL'auteur Noctis Skytower
Parce que vous êtes en déplacement entier signé. Exprimées en nombre entier non signé:
OriginalL'auteur Paya
Vous pouvez utiliser cmath bibliothèque
et de l'utiliser comme
Cette fonction obtenir une valeur flottante en entrée et une valeur booléenne en sortie.
par exemple
vous donnera un 0 en sortie (faux)
mais tout en utilisant cette fonction, vous devez être prudent au sujet de zéro
La sortie de ces lignes ne sont pas les mêmes.
Pour supprimer ce problème, vous pouvez utiliser:
qui donne:
OriginalL'auteur Hadi Rasekh
Pour les entiers, test
number < 0
.Pour les nombres à virgule flottante, vous pouvez également prendre en compte le fait que le zéro a un signe. C'est, il existe un -0.0 qui est distincte de +0.0. Pour distinguer les deux, vous souhaitez utiliser std::signbit.
OriginalL'auteur John
La
>>
opérateur effectue un décalage, qui conserve le signe du nombre.>>
opérateur de la mise en œuvre est définie. Pourrait être n'importe quel type de changement.J'ai dit "la
>>
opérateur effectue une opération arithmétique shift", et c'est exactement ce qu'il fait dans ce cas, à en juger par les OP de la description. Remarquez que j'ai ne pas dire "la>>
opérateur effectue toujours un décalage" ou quelque chose comme ça. Peut-être que j'aurais dû être plus explicite, mais de toute façon, je ne pense pas que ma réponse mérite un downvote.Veuillez justifier vous-mêmes. J'ai expliqué exactement ce que les OP du problème. Je n'ai pas fait de grandes déclarations comme "la
>>
opérateur effectue toujours un décalage"; je l'ai expliqué exactement ce que les>>
opérateur est en train de faire dans ce cas particulier.OriginalL'auteur LukeH
Ma solution qui prend en charge +/-0.
OriginalL'auteur quietk
x
est hors de portée de__int64
OriginalL'auteur SamY