[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开发的性能瓶颈.这里 ...
随机推荐
- feed.snapdo.com 病毒
过程:安装破解office2013 使用破解工具 Microsoft toolkit 2.7 beta 1 关闭防火墙 浏览器被木马篡改:搜索引擎被篡改: 相关进程 bittorrent.exe 无 ...
- codeforces-1131 (div2)
A.把右上角的凹缺口补上变成凸的就成了规则矩形 #include <map> #include <set> #include <ctime> #include &l ...
- hbase-default.xml(Hbase 默认参数翻译)
hbase.tmp.dir \({java.io.tmpdir}/hbase-\){user.name} 本地文件系统上的临时目录.将'/tmp'改为其他可以持久保存文件的位置,通常能够解决java. ...
- MyISAM与InnoDB的区别是什么?
1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件 ...
- sed命令(二)
转自:https://www.cnblogs.com/maxincai/p/5146338.html sed命令用法 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用, ...
- python双端队列-collection模块
双端队列(double-ended queue,或者称deque)在需要按照元素增加的顺序来移除元素时非常有用.其中collection模块,包括deque类型. 使用实例:
- 基本DFS与BFS算法(C++实现)
样图: DFS:深度优先搜索,是一个不断探查和回溯的过程,每探查一步就将该步访问位置为true,接着在该点所有邻接节点中,找出尚未访问过的一个,将其作为下个探查的目标,接着对这个目标进行相同的操作,直 ...
- 自编译Apache Spark2.3.3支持CDH5.16.1
1 下载源代码文件 https://archive.apache.org/dist/spark/spark-2.3.3/ 2 解压后导入编辑器,修改依赖的Hadoop版本,下面截图是修改后的,要看自己 ...
- 秋名山老司机(BS4与正则的比拼)
因为嘉伟思杯里的一个脚本题目,16进制计算,python3正则还没学,所以没写出来.大佬跟我说也可以用BS4,从DOM上下手,直接爬下来直接一个eval就搞定了,eval可以像这样计算16进制,eva ...
- Numpy 多维数组简介
 NumPy是一个功能强大的Python库,主要用于对多维数组执行计算.NumPy这个词来源于两个单词-- Numerical和Python.NumPy提供了大量的库函数和操作,可以帮助程序员轻松地 ...