关于c中的 移位操作,谁解释一下?

jcreatorqijiashe 2004-05-01 08:19:06
大家好:

我看了一篇文章 :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
请问这样联系有什麽好处,为哪里带来了方便呢?据个例子好吗?
多谢!
...全文
326 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jcreatorqijiashe 2004-05-03
  • 打赏
  • 举报
回复
最后一个问题!
文章最后:
struct date_struct {
BYTE day : 5, // 1 to 31
month : 4, // 1 to 12
year : 14; // 0 to 9999
} date;
这个结构全部用 byte,是怎样节约空间的?
antijpn 2004-05-02
  • 打赏
  • 举报
回复
譬如说某种加密算法或者校验算法就可能用到这种操作
dananhai 2004-05-02
  • 打赏
  • 举报
回复
“第二个问题(把bit换算成16进制)就是为了使 表达式更简洁?换算成int型不是更简洁易懂吗? 为什麽一定要转换成16进制而不是 8进制或10进制?”
一个字节8byte而4bit为一个16进制数,2<->16转换方便,至于每个位怎么用的事那是2进制自身的用途了,这个我想不用说了吧。谁也不愿意在自己的程序里写一大堆的0,1串,麻烦,还易出错。
用移位操作追求的大多的效率,空间。楼上的已经说了。另外,一些底层的东西必须通过位屏蔽的方法,获取相应的信息
jcreatorqijiashe 2004-05-02
  • 打赏
  • 举报
回复
多谢楼上的热心讲解。

那个俄罗斯方块的例子不是很懂,如果我希望把一个图形旋转任意角度,我怎麽知道已知的一个数字应该和谁(nibble)进行标志位操作呢?
我说一下我的理解,说的不一定对,如果错了,希望大家指出来:

那个四个标志位(比如0010)和16进制的数字是4<--->1对应的。也就是说16进制数字代表的二进制数字是已知的(那个二进制和16进制对照表应该背下来)。给我一个16进制数字,我就应该知道它的各个位是什麽,这样比如我希望知道 “BYTE b = 50;”这个数字的二进制某一位是1还是0的时候就让他和一个16进制(二进制是已知的)的数字进行位操作,只需要看得到的结果就知道这个50的某一位是0还是1。

这是我的理解,如有不对请指正,多谢!
bshaozi 2004-05-02
  • 打赏
  • 举报
回复
没做过汇编吧
如果要求使大写变为小写
就用这个字母的acii与00100000进行或运算;
反之;
用字母的acii与11011111进行与运算;
(这个问题好像不是什么位移运算啊)
jcreatorqijiashe 2004-05-02
  • 打赏
  • 举报
回复
是这样,还有一点:就是这句:
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的反? 这不是多余吗?
谁解释一下?
allsword 2004-05-02
  • 打赏
  • 举报
回复
“设置为标志位是做什麽,据个应用的例子”
如果你在什么地方认为用标志方便你就用吧,
如,
1,我用*代替1,这样更直观点儿理解
0000
*000
**00
0*00
是俄罗斯方块中的一个图形:换成0x08C4,下一个图形是其旋转的
0000
0000
0**0
**00
换成0x006C;通过这个可很快实现图形的旋转90度
2,有时要定义一个BOOL型的数组不是很长就可用位运算来代替,
如果用位运算是需定义一个变量,随你用它的前多少位或后多少位,
节省空间也快,估计在64位系统普及后这个可能有更大的发挥余地。
3,在编游戏上用的比较多。
jcreatorqijiashe 2004-05-01
  • 打赏
  • 举报
回复
多谢楼上两位指点,第二个问题(把bit换算成16进制)就是为了使 表达式更简洁?换算成int型不是更简洁易懂吗? 为什麽一定要转换成16进制而不是 8进制或10进制?

第一个问题 :
〉〉比如我们可以把这个字节的8个为设置为标志位,就可以通过这个方法判断标志了。
可以具体一点吗?设置为标志位是做什麽,据个应用的例子?
或者就拿它的例子:
00110010 - b
& 00010000 - & 0x10
----------
00010000 - result
这样得到的结果是想做什麽,什麽情况下用这种操作?
请指教!
julyclyde 2004-05-01
  • 打赏
  • 举报
回复
和移位有啥关系?
newegg2002 2004-05-01
  • 打赏
  • 举报
回复
对啊.对于第一个问题,,除了楼上说的判断某位是否为1之外.还可以用来置某位为0;
相同的..|也常用来置某位为1..也可以用它来判断某位是否为1的,,用0来或它就行了..
zhouqingyuan 2004-05-01
  • 打赏
  • 举报
回复
一、判断一个字节的某个位上是否为1,比如我们可以把这个字节的8个为设置为标志位,就可以通过这个方法判断标志了。

二、其实就是简单的使表达简单了而已,否则一个字节你要写8个数字,而用四位bit来表示一个16进制数,一个字节只需要两个数字就可以了。

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧