| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2457 人关注过本帖, 2 人收藏
标题:关于位运算的一个题目,高手请进
只看楼主 加入收藏
A1621378852
Rank: 2
等 级:论坛游民
帖 子:13
专家分:10
注 册:2012-10-23
收藏
得分:0 
以下是引用wp231957在2012-10-23 11:31:00的发言:

右移一位  *2
右移2位   *4
右移3位   *8

左移一位  /2
左移2位   /4
左移3位   /8


反了吧,,,左移不是增大嘛
2012-10-24 23:03
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 19楼 SamWoo
看一下效果不就知道了?
2012-10-24 23:08
SamWoo
Rank: 2
等 级:论坛游民
帖 子:13
专家分:48
注 册:2012-10-17
收藏
得分:0 
回复 20楼 hh373231690
嗯,没考虑负数情况.....
2012-10-24 23:09
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 23楼 SamWoo
不仅仅是负数吧,a^b=a+b仅当a&b=0才行
2012-10-24 23:31
hh373231690
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:138
注 册:2012-10-13
收藏
得分:0 
楼上说的对~~不过这题的解法虽然跑了一遍之后能够明白~~但是要我写的话 应该是写不出来啊。。
2012-10-24 23:35
cyhdahua
Rank: 7Rank: 7Rank: 7
来 自:山东
等 级:黑侠
威 望:2
帖 子:221
专家分:643
注 册:2012-6-15
收藏
得分:2 
这个帖子这么多人关注
我解释一下二进制怎么相加吧
01010+01111=1 1001
在for循环第一个;号前是这个数的8倍,大家都知道了。
那么这个循环之后是怎么加上一倍的呢
第一步:f=a&n是找出相加时是否有需要进一的位:f(只有1+1才进1,而&只保留1,1),如果没有则a^n就是俩个二进制之和(例如:1100+0011=1111)
第二步:a^=n(for循环内部的)把f位清零(因为进一了,01+01=10),把不进一的位相加
第三步:n=f<<1,还是因为进一了(01+01=10)f位向左移动了一位,紧接着就跳入第一步了
例如:
  01010
+ 01111
----------
  11001   

①f:01010
②a:00101
③n:10100
转到
⑴f:00100
⑵a:10001
⑶n:01000
转到
㈠f:00000
结束,但最后还有个a^n
㈡a: 11001

WE GO
2012-10-25 00:19
xtjopt
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:168
注 册:2012-9-12
收藏
得分:0 
勉强看懂 新手学习
2012-10-25 08:14
罗庇鹏ksq
Rank: 5Rank: 5
来 自:太平洋
等 级:职业侠客
帖 子:220
专家分:310
注 册:2012-6-30
收藏
得分:0 
以下是引用SamWoo在2012-10-24 22:23:38的发言:

我想知道你用for语句有什么意图?
直接 a=n<<3;return(a^n); 不行吗?
直接 a=n<<3;return(a^n);
这个必须不行的,别这么粗心,
如果正好左移两个数总有同位都是1的情况,那就置0了,试试50行不行?总之杨大哥的程序怎么可能出错?别质疑。

从来都是无所谓,现在也该学着有所谓。✿咱们一个人,别坐井观天❀
2012-10-25 08:17
Snowzou
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-10-24
收藏
得分:0 
表示想不出来啊。。。。。。
2012-10-25 08:42
cyhdahua
Rank: 7Rank: 7Rank: 7
来 自:山东
等 级:黑侠
威 望:2
帖 子:221
专家分:643
注 册:2012-6-15
收藏
得分:0 
以下是引用hh373231690在2012-10-24 23:35:40的发言:

楼上说的对~~不过这题的解法虽然跑了一遍之后能够明白~~但是要我写的话 应该是写不出来啊。。
在你脑海中如果出现了二进制的加法竖式(像十进制一样,不过是0+0=0、0+1=1、1+1进1得0)
然后利用位运算符
‘&’:能找出1+1的位
‘^’:能运算0+0=0、0+1=1、1+1=0,但是不会进一
所以你再找个变量(设:f)先保存了1+1的位('&之后就能找出'),  
  如果不为0,就运算一次'^',然后把位进一(<<1)
 (注意:第一次‘^’是需要相加的俩个变量,之后两个变量之和是和f)
  如果为0,则:‘^’就是俩个变量的和

WE GO
2012-10-25 08:57
快速回复:关于位运算的一个题目,高手请进
数据加载中...
 
   



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

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