导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[C语言的移位操作]

* 43768: 关于C语言中的移位运算的一个疑问,望各位大侠帮忙解答

   ly889213 
ly889213发表的帖子 

 [C语言的移位操作]
一,
I=257 = 1 0000 0001  (二进制)
I=257/8 = 32.125 = 32   (I为int类型)

I=257>  >  3
 =1 0000 0001>  >    3 = 0...010 0000=2^5=32
右移3位将将最后一个001移除了,1/8=0.125   所以这等价是没问题的


J=456=0...01 1100 1000
J=456%32=8;      (J为int类型)
J=456-(456>  >  4  <  <4);    
456>  >  4=0...01 1100 1000>  >  4
            =0...01 1100
然后再左移四位,则低四位补0:   0...01 1100 0000
上面两步实际上是将低四位变为了0,也就是由原来的1000变为现在的0000
所以现在数比移位操作前少了1000,也就是8
所以J=456-(456>  >  4  <  <4)=8

这里的求余运算我们还可以这样:
456=0...01 1100 1000=0x1c8
那么求456%32,就只要知道低5位是多大就OK了
所以456%32=0x1c8 & 0x01f,这样从第6位开始就全部变为0,余下的就是所求。

J=456=0...01 1100 1000
从上面的分析就知道
456>  >  3  <  <3比456而言就是低3位 000 变为现在的 000,
嘿嘿,没变,所以 k  = 456 - (456>  >  3  <  <3)=0

456>  >  4  <  <4比456而言就是低4位 1000 变为现在的 0000,
小了8,所以 l  = 456 - (456>  >  4  <  <4)=8

456>  >  5  <  <5比456而言就是低5位 01000 变为现在的 00000,
小了8,所以 m  = 456 - (456>  >  5  <  <5)=8

456>  >  6  <  <6比456而言就是低6位 001000 变为现在的 000000,
小了8,所以 n  = 456 - (456>  >  6  <  <6)=8

456>  >  7  <  <7比456而言就是低7位 1001000 变为现在的 0000000,
小了2^6+2^3=64+8=72,所以 o = 456 - (456>  >  7  <  <7)=72



发表时间:2008年11月4日19:04:28

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  45379.[详细]关于C语言中的移位运算的一个疑问,望各位大侠帮忙解答
摘要:大家都知道,实现高效的C 语言编写的方法中,有一招是使用位操作。 我前几天在网上看到一篇文章中讲到以下一个例子,就是关于移位运算的问题。 作者给了一个比较,首先是正常的运算: int I,J......(943字)
- [LEON1741][966次] 2008年5月19日

[上一篇帖子]:USB转真并口解决方案USB转真并口解决方案   http://www
[下一篇帖子]:2008,盛世中国 嵌入你的中国心!2008,盛世中国 嵌入你的中国心!