2015-08-15 3 views
1

Мне интересно, есть ли способ сделать расширение знака дополнения двух, как в C/C++ в Python, используя стандартные библиотеки (желательно на bitarray).Расширение знака расширения дополняющего знака?

C/C++:

// Example program 
#include <iostream> 
#include <string> 

int main() 
{ 
    int x = 0xFF; 
    x <<= (32 - 8); 
    x >>= (32 - 8); 
    std::cout << x; 
    return 0; 
} 

А вот функция Python Я написал, который (в моем тестировании) выполняет то же самое. Я просто интересно, если есть встроенный (или просто быстрее) способ сделать это:

def sign_extend(value, bits): 
    highest_bit_mask = 1 << (bits - 1) 
    remainder = 0 
    for i in xrange(bits - 1): 
     remainder = (remainder << 1) + 1 

    if value & highest_bit_mask == highest_bit_mask: 
     value = (value & remainder) - highest_bit_mask 
    else: 
     value = value & remainder 
    return value 
+0

http://stackoverflow.com/q/1604464/2823755 – wwii

+0

Ах, раньше не было видно, что раньше. Спасибо что подметил это. – Vasu

+0

Это для преобразования строк, хотя. – wwii

ответ

7

Следующий код обеспечивает те же результаты, что и ваша функция, но немного короче. Кроме того, очевидно, что если вы собираетесь применить это к большому количеству данных, вы можете предварительно вычислить обе маски.

def sign_extend(value, bits): 
    sign_bit = 1 << (bits - 1) 
    return (value & (sign_bit - 1)) - (value & sign_bit) 
Смежные вопросы