| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 511 人关注过本帖
标题:【提问】如何高效实现这种运算?(详情在帖子里)
只看楼主 加入收藏
elfpath
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-6-13
结帖率:0
收藏
已结贴  问题点数:20 回复次数:9 
【提问】如何高效实现这种运算?(详情在帖子里)
这个 问题之前我放在别的坛子了,但是一直解决不了。。。所以求助专业论坛 - -
int类型整数有32位,只有左边低的8位有取值,其余的右边高24位都是0。例如X=00000000 00000000 00000000 hgfedcba。
现在要实现一种 二目 不定输出 的运算“☆”。对于X☆Y,称X为加数,Y 为被加数。
一、先用 一位bit 0,1 来解释“☆”:0☆0=0,1☆0=1;0☆1=1;以上三种情况和 XOR输出结果一致。特别地,是1☆1={0,1},也就是说1☆1输出两个结果 0和1,含义是1☆1可能是0也可能是1。也就是说,当加数和被加数的同一bit位上 都是1 时, 则这一bite位上有两种输出0,1.

二、两bit来举例,00☆01=01,10☆01=11。特别地,10☆11={01,11}(因为最高bit位 都为1,所以最高比特位输出0,1两种形况,而低bite位0☆1=1,只有一种情况,再把高位和低位组合在一起就是{01,11}),含义是10☆11可能等于01也可能等于11。
       三bit举例就是 110☆111={001,011,101,111}。

三、好啦 ,现在问题来了。如何快速有效的 计算 X☆Y的输出?当然,X,Y都是 00000000 00000000 00000000 hgfedcba这样的int值。


为了引来“玉”,我说一下我能想到“最好”的很渣的方法 :
首先,开一个2^8 * 2^8 * 2^8 的立方型空间。 把 2^8行 想象成  X 低8位的2^8个值;把2^8行列想象成 Y 低8位的2^8个值;把 2^8竖 想象成  全部  的低8位的2^8个值。
然后(预处理),对于每一个输入(X,Y),一个一个判断2^8个值是不是 X☆Y的输出:是,就在(X,Y)那一竖上标记1;不是,就(X,Y)那一竖上标记0。
最后;当计算X0☆Y0时,就回来查表(X0,Y0)对应的这那些竖上是1,就把对应的值放进输出中。


这个方法的开的空间大,速度慢。。。。行不通。。。。
来吧!大家有什么想法说说看!
搜索更多相关主题的帖子: 如何 专业 
2015-06-13 23:36
elfpath
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-6-13
收藏
得分:0 
这个论坛 好古朴呀
2015-06-13 23:39
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
不就是位运算,同为1时有两个结果,其余情况属异或运算,根据这种规则求两个8位二进制数运算后的结果集合吗。问题是运算后的结果集合你需要怎样表示(或存储)。

能编个毛线衣吗?
2015-06-14 07:28
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
可以利用空闲部分的一个字节来表示。

重剑无锋,大巧不工
2015-06-14 08:29
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
如果两个数字全为1,共有256个组合。

能编个毛线衣吗?
2015-06-14 08:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
程序代码:
#include <stdio.h>

int cal_star(int a, int b)
{
    char * ca = (char *)&a, * cb = (char *)&b;
    ca[1] |= ca[0] & cb[0] | cb[1];
    ca[0] ^= cb[0];
    return a;
}

void sub_output(char * a, unsigned char i)
{
    static unsigned char r;
    if(!i)
    {
        printf("%u\n", r);
        return;
    }
    if(a[1] & i)
    {
        sub_output(a, i >> 1);
        r ^= i;
        sub_output(a, i >> 1);
        r ^= i;
    }
    else
    {
        r ^= a[0] & i;
        sub_output(a, i >> 1);
        r ^= a[0] & i;
    }
}

void output(int a)
{
    sub_output((char *)&a, 0x80);
}

int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    output(cal_star(a, b));
    return 0;
}

重剑无锋,大巧不工
2015-06-14 09:01
elfpath
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-6-13
收藏
得分:0 
回复 3楼 wmf2014
版主理解地完全正确!

对于输出的结果,我想以下两种方式都行:
一、输出一个接着一个让我访问,然后做操作(存储啊,再和别值的做运算啊什么)
二、一下子把所有输出(当然,最多有256中可能)全存起来,然后一个一个访问。

我之前的方法是 先建立256*256*256的表,对应(X,Y,X☆Y)。然后遍历256*256*256种情况,符合运算的标记1,不符合的标记0.
但是,这有很大问题。首先,首先这个预处理的表的复杂度就有256*256*256*8(最后这个8 是低八位bit)。其次是,每次运算一个还要遍历256。
我觉得我的办法很笨,但又想不出好的。

又或者,版主大人, 对于我的这个 预处理256*256*256的表 有没有什么好的办法做?

[ 本帖最后由 elfpath 于 2015-6-14 09:14 编辑 ]
2015-06-14 09:13
elfpath
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2015-6-13
收藏
得分:0 
回复 6楼 beyondyf
太感谢又一个版主,大清早起来给大家解答问题!向您致敬!
程序 等我回实验室,再做实验,先好好看看,不懂会向您请教!
2015-06-14 09:17
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
顺道而已。这个运算满足交换律与结合律。计算本身有点量子运算的意思,挺好玩。

重剑无锋,大巧不工
2015-06-14 09:29
快速回复:【提问】如何高效实现这种运算?(详情在帖子里)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017211 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved