[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代码。

posted @ 2019-04-04 10:20  wildkid1024  阅读(623)  评论(0编辑  收藏  举报