zoukankan      html  css  js  c++  java
  • [python][cpp]对浮点数进行n位翻转

    问题

    在py编程中,碰到一个小问题,如何把一个浮点数按位反转,这个问题说大不大,说小不小,一开始觉得很容易,后来仔细考虑了一下,没有想像的那么简单。

    思路

    按照一般的python解决思路,肯定是寻找相对应的python库,但是很遗憾,对浮点数位操作的库目前还没有。

    那么接下来是就是按照‘手算’的思路来解决,大致分为如下:

    1. 将浮点数按照754标准转化为32位或者64位二进制字符串。
    2. 对该字符串的指定位置进行翻转(0->1或者1->0),得到新的字符串。
    3. 对新的字符串进行转码,按照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代码。

  • 相关阅读:
    MVC三层架构
    Cookie
    request (请求转发)
    response 重定向
    HttpServletResponse(响应),实现文件下载,实现验证码功能
    HTTP报文格式
    基于UUID生成短ID
    一致性hash应用到redis
    spring-mysqlclient开源了
    Effection Go
  • 原文地址:https://www.cnblogs.com/wildkid1024/p/10653379.html
Copyright © 2011-2022 走看看