CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

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

楼主jcreatorqijiashe(秋天的童话)2004-05-01 20:19:06 在 C/C++ / 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

相关问题

  • 关于C++中的移位操作符
  • delphi中如何实现c中的'<<'和'>>'移位操作符?急..急..急..急..急..
  • 菜鸟初学java,关于移位操作老看不明白,请高手帮忙解释一下
  • VB中数据的移位操作?
  • vb中如何进行移位操作
  • 初学C#,谁能给我解释下一元操作符什么意思(+和-)?????????
  • ???C#操作xml?!!
  • C# 操作Excel
  • 关于C中的移位问题????
  • C#文件操作

关键词

  • 二进制
  • 数字
  • 进制
  • 移位操作
  • bit
  • 知道
  • byte
  • set

得分解答快速导航

  • 帖主:jcreatorqijiashe

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo