| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 572 人关注过本帖
标题:大家帮我看一段代码
只看楼主 加入收藏
yxdn001
Rank: 2
来 自:江西
等 级:论坛游民
帖 子:12
专家分:17
注 册:2010-12-9
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
大家帮我看一段代码
这几天正在学习按位运算符,可能是我资料太少了,就一本《C语言入门经典(第四版)》,里面的内容还是很清淅的,比较适合初学者学,就是有的知识点讲得还不够多,讲一个例子就过了,所以理解起来有点费神,通常是一个知识点要反复看好几遍才明白(也可能是我的理解能力不足),如果大家有什么好的资料的话,可以推荐给我,在这里先谢过了,好了,回到正题。
按位运算符  &,|,^,~,<<,>>,这些在算二进制运算的时候我能理解,那么,再将这些按位运算符运用到变量中去我就有点不理解了,先看一段代码:
程序代码:
#include<stdio.h>

int main()
{
    unsigned int original = 0xABC;
    unsigned int result = 0;
    unsigned int mask = 0xF;

    printf("\n original = %X", original);
    result |= original&mask;

    original >>= 4;
    result <<= 4;
    result |= original&mask;

    original >>= 4;
    result <<= 4;
    result |= original&mask;
    printf("\t result = %X\n", result);

    return 0;
}
代码输出如下:original = ABC result = CBA
    这里使用到了掩码概念。original中最右边的十六进制数是通过表达式original&mask将original和mask的值执行按位与操作而

获得的。这会把其他十六进制数设置为0。因为mask的值的二进制形式为:0000 0000 0000 1111。可以看出,只有右边的4位没有改

变。在original中,这4位都是1,在执行按位与操作的结果中,这4位仍是1,其它位都是0。这是因为0与任何值执行按位与操作,结果

都是0。选择了右边4位后,用下面语句储存结果:result |= original&mask;result的内容与右边表达式生成的十六进制数进行或操

作,为了获得original中的第二位,需要把它移动到第一个数字所在的位置。为此将original向右移动4位: original >>= 4;第一

个数字被移出,且被舍弃。为了给 original的下一个数字腾出空间,下面的语句将result的内容向左移动4位:result <<= 4;现在要

在result中插入original中的第二个数字,而当前这个数字在第一个数字的位置上,使用下面的语句:result |= original&mask;要

得到第三个数字,重复上述过程。显然,可以对任意多个数字重复这个过程。

以上一段是资料里的解释,那么这里有几个问题:
问题1:为什么说original中最右边的十六进制数是original&mask按位与操作获得的,original&mask值不是储存在result里面吗?

问题2:original的值是0xABC,二进制表示是0000 1010 1011 1100还是1010 1011 1100 0000

问题3:能不能详细解释一下掩码的概念,资料里只是说定义一个值一般称为掩码,用于选择需要的位。

问题4:由于问题实在很多,要是有高手能把代码详细的解释下那就最好。

不胜感激。

搜索更多相关主题的帖子: 代码 
2010-12-16 00:58
丶倾城
Rank: 2
等 级:论坛游民
帖 子:11
专家分:23
注 册:2010-12-8
收藏
得分:4 
- -。。文字多了一看就迷糊....看了前几句好像你没弄清的是
 
  original&mask
original  0000 1010 1011 1100
mask                     1111
--------------------------------
                         1100
...描述很麻烦  我没看  
2010-12-16 09:47
yxdn001
Rank: 2
来 自:江西
等 级:论坛游民
帖 子:12
专家分:17
注 册:2010-12-9
收藏
得分:0 
回复 2楼 丶倾城
对,前面我是这样理解的,但是得不到代码里的结果
2010-12-16 10:26
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:4 
你为什么说original&mask值不是储存在result里面呢???

愿用余生致力编程
2010-12-16 10:46
yxdn001
Rank: 2
来 自:江西
等 级:论坛游民
帖 子:12
专家分:17
注 册:2010-12-9
收藏
得分:0 
回复 4楼 我菜119
是储存在result里呀
2010-12-16 11:28
yxdn001
Rank: 2
来 自:江西
等 级:论坛游民
帖 子:12
专家分:17
注 册:2010-12-9
收藏
得分:0 
好了,这题被我弄了,第一个 result |= original&mask;的值是0000 0000 0000 1100,接下来,original >>= 4;,就是0000 0000 1010 1011,result <<= 4;的值就是0000 0000 1100 0000,第二个result |= original&mask;就是0000 0000 1100 1011,接下来original>>=4的值是0000 0000 0000 1010 result<<=4的值是0000 1100 1011 0000,那么第三个result |= original&mask;的值就是
0000 1100 1011 1010,换成十六进制就是CBA

   

   
2010-12-16 12:01
快速回复:大家帮我看一段代码
数据加载中...
 
   



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

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