以下是C++中的代码:
void sign_extending(int x)
{
int r; // resulting sign extended number goes here
struct {signed int x:5 ;} s;
r = s.x = x;
cout << r;
}
void Run()
{
int x=29; // this 29 is -3 ( 11101 ) in 5 bits
// convert this from using 5 bits to a full int
sign_extending(x);
}这段代码的输出是-3。当我尝试用python重现这段代码时,生成的位字段为11101,但是当将答案转换为int时,得到的结果是29。
以下是python的代码:
from bitarray import *
def sign_extending(x) :
s = bitarray(5)
r = s = bin(x) #resulting sign extended number goes in r
print (int(r, 2))
x = 29 #this 29 is -3 ( 11101 ) in 5 bits. Convert this from using 5 bits to a full int
sign_extending(x)我也使用了ctypes结构作为替代代码,但没有用处:
from ctypes import *
def sign_extending(x, b):
class s(Structure):
_fields_ = [("x", c_int, 5)]
r = s.x = x
return r #resulting sign extended number goes in r
x = 29; #this 29 is -3 ( 11101 ) in 5 bits.
r = sign_extending(x, 5) #Convert this from using 5 bits to a full int
print r我的问题是,我如何使用位数组或任何其他给出正确答案的方法来产生这个结果。
发布于 2016-08-06 10:05:49
在您的代码中,s是一个类,而类x成员实际上表示字段类型,因此赋值s.x = 29实质上是销毁该对象并为其赋值一个普通的Python int。示例:
>>> from ctypes import *
>>> class S(Structure):
... _fields_ = [('x',c_int,5)]
...
>>> S.x
<Field type=c_long, ofs=0:0, bits=5>
>>> S.x = 29
>>> S.x
29而且,即使您首先创建一个实例,r = s.x = 29也不会像在C/C++中那样先执行s.x = 29,然后执行r = s.x,而实际上是执行r=29和s.x=29。示例:
>>> from ctypes import *
>>> class S(Structure):
... _fields_ = [('x',c_int,5)]
...
>>> s=S()
>>> r=s.x=29
>>> s.x
-3
>>> r
29因此,要修复、实例化该类,请分配s.x = 29并返回它:
from ctypes import *
def sign_extending(x, b):
class S(Structure):
_fields_ = [("x", c_int, b)]
s=S()
s.x = x
return s.x
x = 29; #this 29 is -3 ( 11101 ) in 5 bits.
r = sign_extending(x, 5) #Convert this from using 5 bits to a full int
print r输出:
-3发布于 2016-08-06 02:00:14
我认为这可能会做你想要的(只要x是非负的,并且可以用b位来写)。
def sign_extend(x, b):
if x >= 2 ** (b - 1):
return x - 2 ** b
else:
return xhttps://stackoverflow.com/questions/38794715
复制相似问题