首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的位字段专门化

python中的位字段专门化
EN

Stack Overflow用户
提问于 2016-08-06 01:20:05
回答 2查看 1.1K关注 0票数 2

以下是C++中的代码:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
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结构作为替代代码,但没有用处:

代码语言:javascript
复制
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

我的问题是,我如何使用位数组或任何其他给出正确答案的方法来产生这个结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-06 10:05:49

在您的代码中,s是一个类,而类x成员实际上表示字段类型,因此赋值s.x = 29实质上是销毁该对象并为其赋值一个普通的Python int。示例:

代码语言:javascript
复制
>>> 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=29s.x=29。示例:

代码语言:javascript
复制
>>> 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并返回它:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
-3
票数 2
EN

Stack Overflow用户

发布于 2016-08-06 02:00:14

我认为这可能会做你想要的(只要x是非负的,并且可以用b位来写)。

代码语言:javascript
复制
def sign_extend(x, b):
    if x >= 2 ** (b - 1):
        return x - 2 ** b
    else:
        return x
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38794715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档