| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3231 人关注过本帖, 1 人收藏
标题:怎么理解位逻辑与运算哦?晕了,看半天不懂
只看楼主 加入收藏
fyz520
Rank: 1
等 级:新手上路
帖 子:120
专家分:1
注 册:2010-1-27
结帖率:95.12%
收藏(1)
已结贴  问题点数:10 回复次数:5 
怎么理解位逻辑与运算哦?晕了,看半天不懂
书上有一段话是这样的:

逐位求与操作经常驻用来屏蔽掉某些二进制位。例如,数字字符“6”的ASCLL代码值为0x36,高半字节的0x3╳是表示ASCLL码集合中数字字符的特征码,而低半字节0x6才代表该数字的值6,若将一个数字字符串如“62868”转换成其数值时,需从该数字字符串的每个数字字符中,即从它的ASCLL代码值中屏蔽掉高4个二进制位,取出该位数字的值,然后按十进制位依次拼装。那么屏蔽掉某数字字符高4个二进制位的方法是取屏蔽码0x0f,把该数字字符的ASCLL代码值和屏蔽码0x0f进行逐位与操作,即:0x36 & 0x0f = 0x06
                        



我在书上查的ASCLL表和这段话说的好像不太一样,6的ASCLL代码值八进制是006,十六进制是06,没有0x36的啊,也不知道从哪冒出的屏蔽码0x0f,这是啥意思?


哪位大侠能举个例子说明一下位逻辑与或非运算符的用法哈,小弟在此谢过了。。。。这一章有点难,看不懂。。。

比如这个
char x,y;
y=x | 0x04;
y的值是怎么求出来的
搜索更多相关主题的帖子: 运算 逻辑 
2010-01-28 15:22
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:5 

计算机中所有的存储都是二进制的(以下用8位二进制数为例).
位运算,就操作数按位的方式进行运算.
比如char x='A';那么在内存中存储的是01000001即十进制65
0x04是16进制的,即二进制数00000100
y=x|0x04;y的值计算如下:
01000001    //x的二进制数(我假设它是'A')
00000100    //0x04的二进制数
01000101  //按位或运算(对照上面的两数,按位对齐进行运算)结果,即y的值,那么是十进制69即'D'

[ 本帖最后由 cnfarer 于 2010-1-28 16:56 编辑 ]

★★★★★为人民服务★★★★★
2010-01-28 16:49
fyz520
Rank: 1
等 级:新手上路
帖 子:120
专家分:1
注 册:2010-1-27
收藏
得分:0 
谢谢哦,大概意思懂了,怎么才能知道十六进制的0x04等于二进制00000100啊,这是ASCLL码值吗?有表查不
2010-01-28 17:11
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
二、八、十六之间的转化比较好算。

二转十六:
二的各次幂是:1,2,4,8,16,32……
0x04 就是4。
4 = 4 + 0 + 0
所以二进制就是100

随便来一个别的:
比如37:
37 = 32 + 5 = 32 + 4 + 1 (如果2的那几个幂有点熟悉的话,很容易做到这样分解)
所以 37 是 100101 (32 是 2 的 5 次方,所以写完 1 之后先写 5 个 0,这样不容易错,反正我有时是这样)
把它划成4个4个一位,就是 0010 0101,转成十六进制就是 0x25。

我感觉二转十六就靠背就行,看着眼熟的话,转的很快。
1    0001
2    0010
3    0011
4    0100
5    0101
6    0110
7    0111
8    1000
9    1001
A    1010
B    1011
C    1100
D    1101
E    1110
F    1111

不过编程的时候很少需要做这些进制转换,如果真要就用计算器。这是很正常的事,没什么奇怪的。
好的调试器应该可以指定显示的进制,而不是要自己再转化。

十六进制经常用在位运算里,不需要知道它代表的数是几(这种情况应该用十进制),而是要知道它的那个位是1。因为一个字节正好是8个字节,也就是两位十六进制数。
比如要想把一个 char 变量的低四位清零,可以用这个语句:
x &= 0xf0;
它很好想,f 就是高四位全是 1,0 就是低四位全是0。
这么着一与(或者说一乘,这个叫法不错,位与有时也叫乘法,很直观,乘以1不支,乘以0变0),前边的不动,后面的变0,就达到目的了。没人关心 0xf0 这个数是几。

是不是有点习惯了?
再来个更常见的例子:
把一个 int 的符号位清零:
x &= 0x7f;
2010-01-28 23:01
fyz520
Rank: 1
等 级:新手上路
帖 子:120
专家分:1
注 册:2010-1-27
收藏
得分:0 
大侠就大侠,谢谢了哦,经你这么一说我懂了,我来分析一下最后一个例子:把一个 int 的符号位清零,因为符号位占存储空间的第一位,我们把第一位清零而其他位不变,按照位与的说法乘以1不变,乘以0变0,我们只要用它来和0111 1111做位与运算这样就达到目的了,而0111就是7,1111是F,所以是0x7f,而0x7f可以说一个操作码,只是用它来做int的符位清零运算工具,所以我们没必要管它的值是多少,是这样吗?大侠
2010-01-29 12:48
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
正确

★★★★★为人民服务★★★★★
2010-01-29 15:06
快速回复:怎么理解位逻辑与运算哦?晕了,看半天不懂
数据加载中...
 
   



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

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