鱼C论坛

 找回密码
 立即注册
查看: 2231|回复: 4

求大神帮忙讲解一下这个代码函数的原理

[复制链接]
发表于 2019-8-22 15:33:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # 这是一个C中的结构体类型,有M,E,S三个无符号整型变量,其中23,8,1这三个数字代表这三个变量的位宽
  2. class FloatBits(ct.Structure):
  3.     _fields_ = [
  4.         ('M', ct.c_uint, 23),
  5.         ('E', ct.c_uint, 8),
  6.         ('S', ct.c_uint, 1)
  7.     ]

  8. # 这是一个C中的联合体结构,其中'bits'是这个联合体的匿名结构体
  9. class Float(ct.Union):
  10.     _anonymous_ = ('bits',)
  11.     _fields_ = [
  12.         ('value', ct.c_float),
  13.         ('bits', FloatBits)
  14.     ]

  15. # 这个函数的功能是求大于等于X的2的n次幂的那个n,函数最终返回的是那个n
  16. def nextpow2(x):
  17.     if x < 0:
  18.         x = -x
  19.     if x == 0:
  20.         return 0
  21.     d = Float()
  22.     d.value = x
  23.     if d.M == 0:
  24.         return d.E - 127
  25.     return d.E - 127 + 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-25 10:34:05 | 显示全部楼层
这个是python和c混合编程的一个库ctypes
你不妨自己去看一下官方文档https://docs.python.org/2/library/ctypes.html#bit-fields-in-structures-and-unions
从15.17.1.10 Structures and unions 开始看。。。
大概讲的是,python定义的结构体和联合体必须派生自ctypes的基类,(python定义的是基于ctypes基类的子类)每个子类必须定义一个_fields_属性,_fields_属性是一个二元组列表,元组包含一个字段名和一个字段类型。_fields_属性元组有三个参数的时候,第三个参数指定位宽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-27 09:04:24 | 显示全部楼层
同意楼上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-29 10:46:28 | 显示全部楼层
傻纸 发表于 2019-8-25 10:34
这个是python和c混合编程的一个库ctypes
你不妨自己去看一下官方文档https://docs.python.org/2/library/c ...

你好,我能理解这个代码调用了C的外部库,但是我其实是想问下这个函数的实现过程,因为好像是位运算,我没大看懂。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-29 12:33:11 | 显示全部楼层
本帖最后由 傻纸 于 2019-8-29 12:57 编辑
瓜瓜咚 发表于 2019-8-29 10:46
你好,我能理解这个代码调用了C的外部库,但是我其实是想问下这个函数的实现过程,因为好像是位运算,我 ...


那这个太学术了,我也不懂了。我好像找到了这个程序的原作者,他对这个程序有一些解释
读Matlab7.11的nextpow2函数http://blog.sina.com.cn/s/blog_4513dde60100r0i9.html
float加法器的VHDL实现(一)——优先编码器http://blog.sina.com.cn/s/blog_4513dde60100o6t4.html
float加法器的VHDL实现(二)——右移移位器http://blog.sina.com.cn/s/blog_4513dde60100o6t3.html
float加法器的VHDL实现(三)——未完成版(一)http://blog.sina.com.cn/s/blog_4513dde60100o6t2.html
作者:xialulee
对于位字段的位移操作用c语言理解起来可能会更好点。你要是研究出来了,可以通俗点的和大家分享一下^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-17 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表