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

转载于:https://www.cnblogs.com/wildkid1024/p/10653379.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值