2016-08-06 13 views
2

Hier ist ein Code in C++:Zeichen aus einer variablen Bit erstreckende Breite

#include <iostream> 
#include<limits.h> 
using namespace std; 

void sign_extending(int x,unsigned b) 
{ 
    int r;  // resulting sign-extended number 
    int const m = CHAR_BIT * sizeof(x) - b; 
    r = (x << m) >> m; 
    cout << r; 
} 

void Run() 
{ 
    unsigned b = 5; // number of bits representing the number in x 
    int x = 29;  // sign extend this b-bit number to r 
sign_extending(x,b); 
} 

Ergebnis: -3

Die resultierende Zahl wird eine vorzeichenbehaftete Zahl mit seiner Anzahl von Bits gespeichert werden, in b. Ich versuche, diesen Code in Python zu replizieren:

from ctypes import * 
import os 

def sign_extending(x, b): 
    m = c_int(os.sysconf('SC_CHAR_BIT') * sizeof(c_int(x)) - b)  
    r = c_int((x << m.value) >> m.value)  # Resulting sign-extended number 
    return r.value 

b = c_int(5)  # number of bits representing the number in x 
x = c_int(29)  # sign extend this b-bit number to r 
r = sign_extending(x.value, b.value) 
print r 

Ergebnis: 29

ich nicht das Zeichen erweiterte Zahl wie von der Ausgabe in C++ bekommen. Ich möchte den Fehler oder Probleme in meinem aktuellen Code (Python) und auch eine mögliche Lösung für das Problem mit dieser Technik kennen.

+0

verwenden, was Sie tun erstreckt Anmelde nicht. In C++ wird diese Erweiterung bereits für Sie signiert, wenn Sie Ganzzahlen mit Vorzeichen verwenden. –

+1

Diese Frage ist _extremely_ ähnlich der, die Sie gestern gefragt haben: http://stackoverflow.com/questions/38794715/bit-field-specialization-in-python –

+1

Auch in C und C++, Verschieben einer negativen Zahl rechts ist [nicht garantiert das Vorzeichenbit zu replizieren] (http://stackoverflow.com/questions/6487918/signed-right-shift-which-compiler-use-logical-shift). –

Antwort

2

können Sie

def sign_extending(x, b): 
    if x&(1<<(b-1)): # is the highest bit (sign) set? (x>>(b-1)) would be faster 
     return x-(1<<b) # 2s complement 
    return x 
+0

ich kann das verwenden, aber ich wollte eine Lösung, die eine Verbesserung gegenüber meinem aktuellen Code war und es nicht komplett ändern –

+0

für mich sieht es wie eine Verbesserung wegen der besseren Lesbarkeit aus;) Ich kann Ihren Code tatsächlich nicht verbessern, sorry. – janbrohl

+0

Warum möchten Sie schlechten Code portieren? Die Leute haben dir gesagt, dass '>>' die Zeichenerweiterung nicht garantiert. Sie sollten diesen Code stattdessen zurück an C++ portieren. – rustyx

Verwandte Themen