Comment trouver TMax sans l'aide de changements
En utilisant UNIQUEMENT
! ~ & ^ | +
Comment puis-je savoir si un nombre 32 bits est TMax?
TMax est le maximum, en complément à deux du nombre.
Mes pensées ont été jusqu'à présent:
int isTMax(int x)
{
int y = 0;
x = ~x;
y = x + x;
return !y;
}
Qui est juste une des nombreuses choses que j'ai en vain ont essayé, mais je ne peux pas penser à une propriété de TMax, qui me donnerait TMax dos. Comme l'ajout de tmax à lui-même devrait être unique par rapport à tous les autres entiers.
Ici, est le problème réel:
/*
* isTMax - return 1 if x is the maximum, two's complement number,
* and 0 return otherwise.
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
int isTMax(int x) {
int y = 0;
x = ~x;
y = x + x;
return !y;
}
int de 32 bits, donc le max signés serait probablement 0x7FFFFFFF
- Qu'est-ce que TMax? Le maximum de non signé (ou signé) entier?
- Je pense que vous aurez besoin d'élaborer sur ce que le TMax est.
- Maximum en complément à deux du nombre. Désolé de ne pas élaborer.
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme ceci peut-être?
0x7FFFFFFF est le maximum positif signé sur 32 bits en complément à deux du nombre.
Je ne suis pas sûr, vous pouvez avoir besoin de le jeter aux non signé pour que cela fonctionne.
Autant que je sache, il n'y a aucun moyen de déterminer si une valeur est la valeur max d'un signé type sans en sachant déjà la valeur maximale de ce type et de faire une comparaison directe. C'est parce que signé des expressions de l'expérience d'un comportement indéfini de débordement. Si il y avait une réponse à votre question, cela impliquerait l'existence d'une réponse à un grave problème non résolu qui a été flottant autour sur pendant un certain temps: procédure de programmation pour déterminer la valeur maximale pour un type signé.
si c'est Tmax : 011111.....
puis nous xor avec 10000....
nous obtenons 11111....
puis nous ~ pour obtenir tous les 0 = 0 , !0 nous obtenons 1:
<<
est interdit dans le titrePasser 3 heures sur ce problème. Je sais que ce problème vient de csapp les données de laboratoire et de sa toute dernière exigence est
Donc, le changement d'opérateur(
<<
/>>
et0x7FFFFFFF
accepté de répondre est interdit maintenant)Ci-dessous est ma façon:
TDD-style:
le retour doit être
0
ou1
. Dans, c,!
+ tout différent de zéro sera de retour0
. Donc!
est un must, sinon nous ne pouvons pas garantir l'obtention0
pour tous les nombres.Première naïf essayer:
parce que
0b0111111...1
(aka2147483647
) est le seul argument qui devrait faireisTmax
retour1
et2147483647 + 1
devrait être10000000...0
(aka-2147483648
)0b011111111...1 xor 0b1000000000...0
est0b11111111111...111
. Parce que nous devons utiliser!
, ce que nous espérons voir se0
(aka0b0000000000000...0
). De toute évidence, il suffit d'appliquer logique de ne pas(aka!
) à0b1111111...1
), puis nous aurons0b000000000000
):laisser printf il
démo
Pas mauvais, seulement
-1
ne fonctionne pas comme nous l'espérions.deuxième essai:
Comparons
-1
et2147483647
11111111111111111111111111111111
01111111111111111111111111111111
Nous pouvons trouver
-1 + 1 = 0
tout2147483647 + 1 = -2147483648
. Souligner encore une fois, ce que nous voulons, c'est diff-1
et2147483647
, parce que les deux d'entre eux de retour1
comme ci-dessus montre. Regarder en arrière pour le protety de logique de ne pas dans c: toute différente de zéro sera de retour 0, donc!-2147483648 == 0
et!(-1 + 1) != 0
. Ne modifier que la partie gauche de l'x ^ (x + 1)
(x
) dansx + !(x + 1)
. Si x est2147483647
,x + !(x + 1)
sera égale àx
.Exécuter de nouveau:
démo
Fait!