So finden TMax ohne Verwendung von Schichten
Mit NUR
! ~ & ^ | +
Wie kann ich herausfinden, ob ein 32-bit-Zahl ist TMax?
TMax ist der maximal -, zweier-Komplement-Zahl.
Meine Gedanken waren bisher:
int isTMax(int x)
{
int y = 0;
x = ~x;
y = x + x;
return !y;
}
Ist nur eine der vielen Dinge, die ich haben erfolglos versucht haben, aber ich kann Sie nicht einfach denken, der eine Eigenschaft des TMax, die mir geben würde, TMax zurück. Wie das hinzufügen von tmax zu sich selbst wäre einzigartig im Vergleich zu allen anderen zahlen.
Hier ist das eigentliche problem:
/*
* 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 ist 32 bit also max unterzeichnet würde wahrscheinlich 0x7FFFFFFF
- Was ist TMax? Die maximale unsigned (oder signed) integer?
- Ich denke, Sie brauchen, um auszuführen, was der TMax ist.
- Maximal zwei-Komplement-Zahl. Sorry für die nicht näher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie das vielleicht?
0x7FFFFFFF wird die maximale positive vorzeichenbehaftete 32 bit-zweier-Komplement-Zahl.
Ich bin mir nicht sicher, müssen Sie möglicherweise, um Sie zu wirken, um nicht signierte, für Sie zu arbeiten.
Soweit ich weiß, gibt es keine Möglichkeit festzustellen, ob ein bestimmter Wert ist der max Wert einer unterzeichnet geben, ohne schon zu wissen, der maximale Wert von diesem Typ und macht einen direkten Vergleich. Dies ist, weil unterzeichnet Ausdrücke Erfahrung zu undefiniertem Verhalten auf überlauf. Wenn es eine Antwort auf deine Frage, es würde bedeuten, die Existenz einer Antwort auf eine ernste ungelöste problem, das ist schon im Umlauf auf, SO dass für einige Zeit: wie Sie programmgesteuert ermitteln, der max-Wert für ein bestimmtes signiert Typ.
wenn es Tmax : 011111.....
wir dann xor mit 10000....
bekommen wir 11111....
wir dann ~, um alle 0s = 0 , !0 erhalten wir 1:
<<
ist es verboten, im TitelVerbringen 3 Stunden an diesem problem. Ich weiß, das problem kommt von csapp-Daten Labor und seine neueste Forderung ist
So, shift-operator(
<<
/>>
und0x7FFFFFFF
aus akzeptierte Antwort ist verboten jetzt)Unten ist mein Weg:
TDD-Stil:
sollte der Ertrag werden entweder
0
oder1
. In, c,!
+ alle einen Wert ungleich null zurück0
. So!
ist ein muss, sonst können wir nicht garantieren immer0
für alle zahlen.Ersten naiven versuchen:
weil
0b0111111...1
(aka2147483647
) ist das einzige argument, das sollteisTmax
zurück1
und2147483647 + 1
sollte10000000...0
(aka-2147483648
)0b011111111...1 xor 0b1000000000...0
ist0b11111111111...111
. Da müssen wir!
, was wir hoffen zu sehen, ist0
(aka0b0000000000000...0
). Natürlich nur für Logik nicht(aka!
) zu0b1111111...1
), dann werden wir0b000000000000
):let ' s printf es
live-demo
Nicht schlecht, nur
-1
nicht funktioniert, als wir erwartet haben.zweiten Versuch:
Vergleichen wir
-1
und2147483647
11111111111111111111111111111111
01111111111111111111111111111111
Finden wir
-1 + 1 = 0
während2147483647 + 1 = -2147483648
. Betonen Sie noch einmal, was wir wollen, ist diff-1
und2147483647
, da beide von Ihnen zurück1
wie oben zeigt. Blick zurück auf die protety von Logik nicht in c: alle ungleich 0 zurück, so!-2147483648 == 0
und!(-1 + 1) != 0
. Ändern Sie einfach Linksx ^ (x + 1)
(x
) inx + !(x + 1)
. Wenn x2147483647
,x + !(x + 1)
wird gleichx
.Wieder laufen:
live-demo
Getan!