python — знак, выходящий из переменной битовой ширины

Вот код на C ++:

#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);
}

Результат: -3

Полученное число будет числом со знаком, число битов которого будет сохранено в b. Я пытаюсь повторить этот код в Python:

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

Результат: 29

Я не могу получить расширенный номер знака так же, как из вывода в C ++. Я хотел бы знать ошибки или проблемы в моем текущем коде (Python), а также возможное решение проблемы с использованием этой техники.

2

Решение

ты можешь использовать

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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]