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)
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:
Oder prägnanter:
%Vor%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.
Hier ist eine Lösung ohne Casting, If-Statements und Verwendung nur der Operatoren, nach denen Sie gefragt haben:
%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).
Tags und Links c integer bit-manipulation