关于c中的 移位操作,谁解释一下?
大家好:
我看了一篇文章 :http://www.codeproject.com/cpp/bitbashing.asp
他解释了 移位操作,其中有几个地方不明白。
1.An ideal use for this is to set up a mask to check the values of certain bits. Say we have a BYTE that contains some bit flags, and we want to check if bit four bit is set.
BYTE b = 50;
if ( b & 0x10 )
cout << "Bit four is set" << endl;
else
cout << "Bit four is clear" << endl;
请问这样0,1做了比较后有什麽好处,他是希望得到什麽效果呢?
2.四位的bit代表0~F十五个数字,四个bit用nibble来表示,它可以把bit和十六进制联系起来:
So if we had one BYTE containing the letter 'r' (ASCII code 114) it would look like this:
0111 0010 binary
7 2 hexadecimal
请问这样联系有什麽好处,为哪里带来了方便呢?据个例子好吗?
多谢!
问题点数:0、回复次数:11Top
1 楼zhouqingyuan(浪帆)回复于 2004-05-01 21:20:27 得分 0
一、判断一个字节的某个位上是否为1,比如我们可以把这个字节的8个为设置为标志位,就可以通过这个方法判断标志了。
二、其实就是简单的使表达简单了而已,否则一个字节你要写8个数字,而用四位bit来表示一个16进制数,一个字节只需要两个数字就可以了。Top
2 楼newegg2002(同志们,同胞们,大学的四年,是扎实基础的四年!!)回复于 2004-05-01 21:39:28 得分 0
对啊.对于第一个问题,,除了楼上说的判断某位是否为1之外.还可以用来置某位为0;
相同的..|也常用来置某位为1..也可以用它来判断某位是否为1的,,用0来或它就行了..Top
3 楼julyclyde(Java初学(大学不教只好自己学))回复于 2004-05-01 22:00:18 得分 0
和移位有啥关系?Top
4 楼jcreatorqijiashe(秋天的童话)回复于 2004-05-01 22:08:21 得分 0
多谢楼上两位指点,第二个问题(把bit换算成16进制)就是为了使 表达式更简洁?换算成int型不是更简洁易懂吗? 为什麽一定要转换成16进制而不是 8进制或10进制?
第一个问题 :
〉〉比如我们可以把这个字节的8个为设置为标志位,就可以通过这个方法判断标志了。
可以具体一点吗?设置为标志位是做什麽,据个应用的例子?
或者就拿它的例子:
00110010 - b
& 00010000 - & 0x10
----------
00010000 - result
这样得到的结果是想做什麽,什麽情况下用这种操作?
请指教!Top
5 楼antijpn(antijpn)回复于 2004-05-02 00:38:43 得分 0
譬如说某种加密算法或者校验算法就可能用到这种操作Top
6 楼allsword(长剑)回复于 2004-05-02 01:06:30 得分 0
“设置为标志位是做什麽,据个应用的例子”
如果你在什么地方认为用标志方便你就用吧,
如,
1,我用*代替1,这样更直观点儿理解
0000
*000
**00
0*00
是俄罗斯方块中的一个图形:换成0x08C4,下一个图形是其旋转的
0000
0000
0**0
**00
换成0x006C;通过这个可很快实现图形的旋转90度
2,有时要定义一个BOOL型的数组不是很长就可用位运算来代替,
如果用位运算是需定义一个变量,随你用它的前多少位或后多少位,
节省空间也快,估计在64位系统普及后这个可能有更大的发挥余地。
3,在编游戏上用的比较多。
Top
7 楼jcreatorqijiashe(秋天的童话)回复于 2004-05-02 09:55:06 得分 0
多谢楼上的热心讲解。
那个俄罗斯方块的例子不是很懂,如果我希望把一个图形旋转任意角度,我怎麽知道已知的一个数字应该和谁(nibble)进行标志位操作呢?
我说一下我的理解,说的不一定对,如果错了,希望大家指出来:
那个四个标志位(比如0010)和16进制的数字是4<--->1对应的。也就是说16进制数字代表的二进制数字是已知的(那个二进制和16进制对照表应该背下来)。给我一个16进制数字,我就应该知道它的各个位是什麽,这样比如我希望知道 “BYTE b = 50;”这个数字的二进制某一位是1还是0的时候就让他和一个16进制(二进制是已知的)的数字进行位操作,只需要看得到的结果就知道这个50的某一位是0还是1。
这是我的理解,如有不对请指正,多谢!Top
8 楼dananhai(大男孩)回复于 2004-05-02 10:44:03 得分 0
“第二个问题(把bit换算成16进制)就是为了使 表达式更简洁?换算成int型不是更简洁易懂吗? 为什麽一定要转换成16进制而不是 8进制或10进制?”
一个字节8byte而4bit为一个16进制数,2<->16转换方便,至于每个位怎么用的事那是2进制自身的用途了,这个我想不用说了吧。谁也不愿意在自己的程序里写一大堆的0,1串,麻烦,还易出错。
用移位操作追求的大多的效率,空间。楼上的已经说了。另外,一些底层的东西必须通过位屏蔽的方法,获取相应的信息Top
9 楼jcreatorqijiashe(秋天的童话)回复于 2004-05-02 19:58:16 得分 0
是这样,还有一点:就是这句:
Another ideal use, is to combine it with the & operator to ensure that certain bits are set to zero. Say we want to clear bit four
BYTE b = 50;
cout << "b = " << b << endl;
BYTE c = b & ~0x10;
cout << "c = " << c << endl;
This would result in the following calculations
00110010 - b
& 11101111 - ~0x10
----------
00100010 - result
取反操作和 &结合使用。 这种用法有必要吗?我的意思就是如果我希望使用一个数字 1110,我可以直接写这个数字 1110使用他阿,为什麽一定要取1的反? 这不是多余吗?
谁解释一下?Top
10 楼bshaozi(俺们那噶不学c!)回复于 2004-05-02 20:59:36 得分 0
没做过汇编吧
如果要求使大写变为小写
就用这个字母的acii与00100000进行或运算;
反之;
用字母的acii与11011111进行与运算;
(这个问题好像不是什么位移运算啊)Top
11 楼jcreatorqijiashe(秋天的童话)回复于 2004-05-03 11:06:27 得分 0
最后一个问题!
文章最后:
struct date_struct {
BYTE day : 5, // 1 to 31
month : 4, // 1 to 12
year : 14; // 0 to 9999
} date;
这个结构全部用 byte,是怎样节约空间的?Top




