隨筆 - 303  文章 - 883  trackbacks - 0
          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          歡迎光臨! 
          閑聊 QQ:1074961813

          隨筆分類(357)

          我管理的群

          公共blog

          • n維空間
          • Email : java3d@126.com 群 : 12999758

          參與管理的論壇

          好友的blog

          我的其他blog

          朋友的網站

          搜索

          •  

          最新評論

                   在我們的教科書中和平時寫的小型應用程序中,很少能見到“<<”移位運算符,個人覺得原因有幾個,第一、我們的程序中時常使用的是十進制數據,如“10”、“0.5”,很少會用到十六進制的數。其次,大部分的初級程序員腦子里沒有二進制、八進制、十六進制的影子,一方面由于學校教育的缺陷所致、一方面是,生活中所見大多十進制的數據。
           
                 為什么要用到非十進制的數制?
          答:因為字節是內存的基本數據單位。八進制在計算機系統里不著重要且奇特的作用,或者說所有和二的N次方(2、4、8、16 ... ... 256、512、1024)的數都和計算機有著莫大的聯系。

                  什么地方,我們會時常見到這些數據?
          答:具個人所見,在表示內存地址、寄存器地址、端口地址,及對一些寄存器進行附值操作時,會時常用到。

                  如何對非十進制數據進行操作?
           答:在C里有不少的運算符提供了這些功能。比如:~位取反,& 位邏輯與 ,| 位邏輯或,^ 位邏輯異或,>> 右移,<< 左移 。用這些操作符,可以以二進制的方式操作數據。

                  為什么要學這些?
          答:這個問題很有意思、也是我們在學習之前必須弄清楚的,如果不知道有什么用,那學完很快就會忘記,且學起來毫無熱情可言。廢話多了,當你打算拿C做一些底層操作,或者你打算在不久的將來或你現在就打算征服Linux內核,那就很有必要學學了,學得好是幫助,學得不好是瓶頸,有點言重了,呵呵!!

          在眾多的位操作符中,偶最常見的就是"<<"這個啦!所以這些只打算說說它,如果你對其他的感興趣,可自行早資料看看。

          首先、你有必要確定你的機器上裝了VC6或VC2005,我這里裝了2005
          然后、復制下面這個程序,到你機器上運行下
          #include <iostream> 
          using 
          namespace std;

          int main(){
                  
          int a = 1;
              cout
          <<a<<endl;
              a 
          = a<<10;
              cout
          <<a<<endl;

              
          return 0;
          }
          打印出來的是 > 1024
          為什么是1024?
          看到沒?上面的代碼,中間有一句是怎么寫的 > a = a<<10;
          對,就是它了,左移位運算符號,這句話做的事情是:
          先將a里的1轉化為二進制的1,然后將他左移10位,每移一位補一個0上去,運行這句之后a在機器里的二進制就成了 10000000000  化為十進制 1*210=1024

          哈哈,是不是有點暈,沒事,再運行下,下面的程序就完全了解了
          #include <iostream> 
          using 
          namespace std;

          int main(){
              
          int a = 1;
              cout
          <<a<<endl;
              a 
          = a<<10;//1*1024
              cout
          <<a<<endl;
              a 
          = 1;
              a 
          = a<<8;//1*256
              cout
          <<a<<endl;
              a 
          = 2;
              a 
          = a<<9;//2*512
              cout
          <<a<<endl;

              
          return 0;
          }

          總結一下,這里a<<n 可以看成 a * 2n 這下了解吧^_^

          接下來再介紹下如何在頭文件里使用<<吧!在頭文件里定義的是宏,所以,一旦定義錯誤,編譯的時候并不會提示出錯,而運行就找了麻煩了,所以一定要小心哦!下面給個簡單的例子吧!

          i.h
          #define A(var) (var<<10)
          main.c
          #include <iostream> 
          using namespace std;

          #include
          "i.h"

          int main()
          {
              cout
          <<A(1)<<endl;

              
          return 0;
          }

          上面,不過是些極其簡單的內容,如果想正真了解,請多看一些低層代碼并多多實踐吧!


          地震讓大伙知道:居安思危,才是生存之道。
          posted on 2008-02-09 20:37 小尋 閱讀(586) 評論(1)  編輯  收藏 所屬分類: c/c++/C#/pasic/vb/php/asp(.net)/win-cgi/xml...

          FeedBack:
          # re: C中的 "<<" 位運算符 2009-02-04 13:39 militala
          真不錯, 謝謝, 喜歡...沒有多少人講這么細, 呵呵....
          收了.  回復  更多評論
            
          主站蜘蛛池模板: 固原市| 巫溪县| 武夷山市| 石城县| 商南县| 五台县| 鄄城县| 廊坊市| 朔州市| 顺义区| 景洪市| 来凤县| 望江县| 高雄市| 丹江口市| 稷山县| 安多县| 乐清市| 佛坪县| 扎兰屯市| 新龙县| 塔河县| 潮州市| 三原县| 汽车| 古蔺县| 朝阳县| 绵竹市| 富源县| 仙桃市| 张家口市| 临桂县| 叶城县| 房产| 灵台县| 江川县| 镇雄县| 佛山市| 兴化市| 岳普湖县| 武定县|