Wie kann man feststellen, ob ein 32-Bit-Int in einen 16-Bit-Short passen kann?

7

Nur verwenden:

%Vor%

Ich muss herausfinden, ob eine vorzeichenbehaftete 32-Bit-Ganzzahl als 16-Bit-Zweierkomplement-Ganzzahl dargestellt werden kann.

Meine ersten Gedanken waren, die MSB 16 Bits und die LSB 16 Bits zu trennen und dann eine Maske für und die letzten 16 Bits zu verwenden. Wenn es nicht Null ist, wird es nicht dargestellt werden können und dann diese Nummer verwenden, um das zu überprüfen MSB-Bits.

Ein Beispiel für die Funktion, die ich schreiben muss, ist: fitsInShort (33000) = 0 (kann nicht dargestellt werden) und fitsInShort (-32768) = 1 (kann dargestellt werden)

    
Vishal 07.09.2011, 16:44
quelle

5 Antworten

8
%Vor%

Nur ein Scherz :) Hier ist die echte Antwort, unter der Annahme Int ist 32 Bits und kurz ist 16 Bits und Zweierkomplement representation:

Bearbeiten: Bitte beachten Sie die letzte Bearbeitung für die richtige Antwort!

%Vor%

Ohne if-Anweisungen glaube ich, das sollte es tun:

%Vor%

Bearbeiten: Oli hat Recht. Ich dachte irgendwie, dass sie erlaubt sind. Hier ist der letzte Versuch, mit Erklärung:

Wir benötigen die 17 höchstwertigen Bits von x entweder nur aus Einsen oder aus Nullen. Beginnen wir mit der Maskierung anderer Bits:

%Vor%

Oder prägnanter:

%Vor%     
cyco130 07.09.2011, 16:58
quelle
8

Wenn eine 32-Bit-Zahl im Bereich [-32768, + 32767] liegt, sind die 17 msbs alle gleich.

Hier ist eine beschissene Art zu sagen, ob eine 3-Bit-Zahl nur Einsen oder nur Nullen sind, die nur Ihre Operationen verwenden (ich nehme an, dass Sie keine bedingten Kontrollstrukturen haben, weil sie implizite logische Operationen erfordern):

%Vor%

Ich überlasse es Ihnen, dieses Konzept zu erweitern / zu verbessern.

    
Oliver Charlesworth 07.09.2011 16:46
quelle
3

Hier ist eine Lösung ohne Casting, If-Statements und Verwendung nur der Operatoren, nach denen Sie gefragt haben:

%Vor%     
Emil Romanus 07.09.2011 19:54
quelle
0
%Vor%     
BlackBear 07.09.2011 16:47
quelle
0
%Vor%

First if Prüft zuerst die + ve-Nummer, indem das vorzeichenbehaftete Bit geprüft wird. Wenn + ve, dann prüft es, ob das Bit 15 bis Bit 31 0 ist, wenn 0, dann kann es nicht in short passen, sonst kann es.

Die negative Zahl ist der Entfernungsbereich, wenn die Bits 15 bis 31 alle gesetzt sind (Darstellung der Zweierkomplement-Methode).

Daher ist die zweite if eine -ve Nummer, dann werden die Bits 15 bis 31 ausgeblendet und die verbleibenden unteren Bits (0 bis 14) werden gesetzt. Wenn dies 0xffffffff ist, wird nur das Einerkomplement 0 sein, was anzeigt, dass die Bits 15 bis 31 alle gesetzt sind, daher kann es passen (der else Teil), andernfalls kann es nicht passen (die if Bedingung).

    
phoxis 07.09.2011 16:46
quelle

Tags und Links