[python][cpp]对浮点数进行n位翻转
问题
在py编程中,碰到一个小问题,如何把一个浮点数按位反转,这个问题说大不大,说小不小,一开始觉得很容易,后来仔细考虑了一下,没有想像的那么简单。
思路
按照一般的python解决思路,肯定是寻找相对应的python库,但是很遗憾,对浮点数位操作的库目前还没有。
那么接下来是就是按照‘手算’的思路来解决,大致分为如下:
- 将浮点数按照754标准转化为32位或者64位二进制字符串。
- 对该字符串的指定位置进行翻转(0->1或者1->0),得到新的字符串。
- 对新的字符串进行转码,按照754标准转化为浮点数。
以上思路包含两个主要的函数,对浮点数的编码和解码,问题是可以直接结局的,但是显然是过于麻烦的,有没有更简单的思路?
显然是有的,我们想起来在c语言中是可以直接操作内存的,这就会使得问题简单很多,对于c语言,可以通过如下方式:
float trans(float w)
{
srand((unsigned)time(NULL));
unsigned char *p;
char b=0x1;
int k = rand()%10, d = rand()%6,i;
for (i=0; i<d; i++){
k = rand()%10
p=(unsigned char *)&w;
*(p+k/8)=*(p+k/8)^(b<<(k%8));
}
return w;
}
上述代码就是随机选取d<6为进行翻转,翻转的位为后10位,当然可能存在一些问题,比如在翻中某些位可能被翻转两次,如果想要都翻转一次,那么就要换一种cpp写法:
class temp
{
public:
float trans(float w);
};
float temp::trans(float w)
{
srand((unsigned)time(NULL));
unsigned char *p;
char b=0x1;
int k = rand()%10, d = rand()%6,i;
vector<int>vt;
for (i=0; i<10; i++){
vt.push_back(32-i);
}
random_shuffle(vt.begin(),vt.end());
for (i=0; i<d; i++){
k = vt[i];
p=(unsigned char *)&w;
*(p+k/8)=*(p+k/8)^(b<<(k%8));
}
return w;
}
extern "C" {
temp obj;
float trans(float w)
{
return obj.trans(w);
}
}
思路为在数组中放入后10位的位置,然后随机反转数组取前6位作为反转的位置。
之所以要写成对象形式,然后再使用extern "C" , 是因为python的ctypes库并不支持cpp,所以使用ctypes来调用cpp代码。
[python][cpp]对浮点数进行n位翻转的更多相关文章
- 面试题-----按位翻转32位unsigned
// test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include < ...
- Python之☞float浮点数精度问题
Python的浮点数损失精度问题(转) 一个简单的面试题: >>>0.1+0.1+0.1 0.2 >>>0.1+0.1+0.1 0.3000000000000000 ...
- 算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!
算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!
- python实现IP地址转换为32位二进制
python实现IP地址转换为32位二进制 #!/usr/bin/env python # -*- coding:utf-8 -*- class IpAddrConverter(object): de ...
- Python中的浮点数原理与运算分析
Python中的浮点数原理与运算分析 本文实例讲述了Python中的浮点数原理与运算.分享给大家供大家参考,具体如下: 先看一个违反直觉的例子: >>> s = 0. > ...
- 【python】Leetcode每日一题-位1的个数
[python]Leetcode每日一题-位1的个数 [题目描述] 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例1 ...
- Python技法:浮点数取整、格式化和NaN处理
1. 取整的三种方法 1.1 强转int类型 这种方法会直接对浮点数的小数部分进行截断(无论是正还是负). print(int(2.7)) # 2 print(int(-2.7)) # -2 1.2 ...
- python 整数和浮点数
整数和浮点数 Python支持对整数和浮点数直接进行四则混合运算,运算规则和数学上的四则运算规则完全一致. 基本的运算: 1 + 2 + 3 # ==> 6 4 * 5 - 6 # ==> ...
- 混合编程[python+cpp+cuda]
很多时候,我们是基于python进行模型的设计和运行,可是基于python本身的速度问题,使得原生态python代码无法满足生产需求,不过我们可以借助其他编程语言来缓解python开发的性能瓶颈.这里 ...
随机推荐
- React学习笔记(一)- 入门笔记
React入门指南 作者:狐狸家的鱼 本文链接:React学习笔记 GitHub:sueRimn 1.组件内部状态state的修改 修改组件的每个状态,组件的render()方法都会再次运行.这样就可 ...
- 不用代码就能实现get与post
这些天在测试各种API,每次都敲代码实现,就显得有点浪费时间了 为了节约时间,提高效率,我想着收集一些可以只用 -命令行- 或者是 -浏览器- 就能够实现的技巧 在这里,我简单测试三种工具来实现 ge ...
- python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)
python全栈开发笔记第二模块 第四章 :常用模块(第二部分) 一.os 模块的 详解 1.os.getcwd() :得到当前工作目录,即当前python解释器所在目录路径 impor ...
- Apache Hadoop 2.9.2 的YARN High Available 模式部署
Apache Hadoop 2.9.2 的YARN High Available 模式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.环境准备 1>.官方文档(htt ...
- Ansible-基础
Ansible架构 Inventory 主机清单,可以对主机分组 ansible-hoc ansible的命令,适用临时场景 ansible-playbook ansible是一个场景的集 ...
- CDN-常用静态资源公共库
js.css 等静态资源可以放在自己的服务器上,或者引用网络上的公共库使用(CDN) CDN 读取失败时从本地加载 <script src="https://code.jquery.c ...
- STL迭代器iterator
一:迭代器原理 迭代器是一个“可遍历STL容器内全部或部分元素”的对象. 迭代器指出容器中的一个特定位置. 迭代器就如同一个指针. 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范 ...
- 制作OpenStack使用的windows镜像
1 安装vmware14 2 创建ubuntu-desktop-16.04虚拟机 选择自定义安装 选择ubuntu-16.04-desktop.iso 内存要大于2G,推荐4G. 磁盘要大于50G 关 ...
- request.getParameterValues 出现 [Ljava.lang.String;@ 错误
在实现简单的本地登录系统时,需要把page1.jsp的表单显示在page2.jsp中. 其中获取page1.jsp表单的办法就是在页面1的<form>中加入action="pag ...
- SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权
最新项目比较忙,写文章的精力就相对减少了,但看到邮箱里的几个催更,还是厚颜把剩下的文档补上. 一.修改ShiroDbRealm类,实现它的doGetAuthorizationInfo方法 packag ...