| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3017 人关注过本帖, 3 人收藏
标题:我发一个关于二进制 0 1 相互转换的 帖子 诚征优秀代码 欢迎各路高手进入 ...
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
还可以化简。而且王姑娘上面代码存在一个问题,对0取反时万哥希望得到什么结果?
程序代码:
unsigned int rev(unsigned int x)
{
    unsigned int i;
    for(i = 1; i && i <= x; i <<= 1);
    return x ^ i - 1;
}
请注意我的循环条件

重剑无锋,大巧不工
2015-05-26 19:42
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:10 
#include <stdio.h>  
//按位(二进制)输出一个整型数据
void prnbit(int k)
{
    if(k==0) return;
    prnbit(k>>1);
    if(k & 1==1) printf("%1d",1); else printf("%1d",0);
}

int main()
{  
   int a=3456,b=0,c,d;
    printf("原始数据是%6d  按位(二进制)输出是:  ",a);
    prnbit(a);
    printf("\n");
    for(d=a,b=0;d>0;b=(b<<1)+1,d>>=1);
    c=(-a-1)&b;
    printf("\n转换后是  %6d  按位(二进制)输出是:  ",c);
    prnbit(c);
    printf("\n");
    return 0;
}
2015-05-26 20:09
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复杨兄弟:0取反后应该是1
我的代码没做这个测试

DO IT YOURSELF !
2015-05-26 22:59
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 31楼 beyondyf
顶一个!这个循环效率明显高好多,确定有效位数也很巧妙。我觉得写成return x ^ (i - 1)好理解些,尽管减号优先级大于异或,再就是判断语句是不是改成"i <= x&&i;"是不是效率更高些?根据c规则,只要i<=x不成立就不需要再判断i是否为0 了。i为0 只有全F的情况才出现,概率小。
输入数据0,结果为0。你和我代码所有测试数据均一样,32楼的代码对负数无法处理。

[ 本帖最后由 wmf2014 于 2015-5-26 23:04 编辑 ]

能编个毛线衣吗?
2015-05-26 22:59
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:0 
考虑负数的的情况:
#include <stdio.h>  
//按位(二进制)输出一个整型数据
void prnbit(unsigned int k)
{
    if(k==0) return;
    prnbit(k>>1);
    if(k & 1==1) printf("%1d",1); else printf("%1d",0);
}

int main()
{  
    int a=-65;
    unsigned int b,c,d;
    printf("原始数据是%6d  按位(二进制)输出是:  ",a);
    prnbit(a);
    printf("\n");
    for(d=a,b=0;d;b=(b<<1)+1,d>>=1);
    c=a^b;
    printf("\n转换后是  %6d  按位(二进制)输出是:  ",c);
    prnbit(c);
    printf("\n");
    return 0;
}

[ 本帖最后由 helloUJS 于 2015-5-27 08:30 编辑 ]
2015-05-27 00:10
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:10 
鉴定完毕,移植性差

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2015-05-27 11:14
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:10 
看了b版的经典算法   思考。。。

授人以鱼,不如授人以渔
2015-05-27 12:45
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
以下是引用wmf2014在2015-5-26 22:59:37的发言:

顶一个!这个循环效率明显高好多,确定有效位数也很巧妙。我觉得写成return x ^ (i - 1)好理解些,尽管减号优先级大于异或,再就是判断语句是不是改成"i <= x&&i;"是不是效率更高些?根据c规则,只要i<=x不成立就不需要再判断i是否为0 了。i为0 只有全F的情况才出现,概率小。
输入数据0,结果为0。你和我代码所有测试数据均一样,32楼的代码对负数无法处理。

如果不考虑溢出那i != 0这个条件可以取掉,但考虑的情况下由于与运算的短路特性顺序不能颠倒,i != 0必须在前面否则当x为最大值时将陷入死循环。概率小不等于概率为0。

关于运算符的优先级,由于已经烂熟于胸,所以写的时候也没想那么多,请见谅。我的编程习惯是不喜欢任何多余的东西,不论是算法上还是编码上。这几行代码是直接敲在回复框里的,量少,觉得没有测试的必要。

如果要求0的输出为1,可做如下改动
程序代码:
unsigned int rev(unsigned int x)
{
    unsigned int i;
    for(i = 1; i && i <= x; i <<= 1);
    return x ^ (i - 1 | 1);
}

重剑无锋,大巧不工
2015-05-27 21:55
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 38楼 beyondyf
经验证,x=0xFFFFFFFF时,没有死循环。i=0时,i<=x||i运算才会因短路而死循环的。
收到的鲜花
  • beyondyf2015-05-27 23:18 送鲜花  50朵   附言:多谢指正

能编个毛线衣吗?
2015-05-27 22:34
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 39楼 wmf2014
呵 呵,看来不进行测试还是不行啊,托大一次就露怯了。虽然代码没出错,但我的想法是错误的。瞬间的思维混乱而致,所以这小概率事件也要重视。

感谢王姑娘斧正,它俩的顺序确实没关系,谁前谁后效率是一样的。

重剑无锋,大巧不工
2015-05-27 23:16
快速回复:我发一个关于二进制 0 1 相互转换的 帖子 诚征优秀代码 欢迎各路高 ...
数据加载中...
 
   



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

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