Python - расширение двух знаков дополнения?

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

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

person Vasu    schedule 15.08.2015    source источник
comment
stackoverflow.com/q/1604464/2823755   -  person wwii    schedule 16.08.2015
comment
Ах, не видел этого раньше почему-то. Спасибо что подметил это.   -  person Vasu    schedule 16.08.2015
comment
Однако это для преобразования строк.   -  person wwii    schedule 16.08.2015


Ответы (1)


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

def sign_extend(value, bits):
    sign_bit = 1 << (bits - 1)
    return (value & (sign_bit - 1)) - (value & sign_bit)
person Patrick Maupin    schedule 16.08.2015