隨筆-28  評論-15  文章-81  trackbacks-0
          C提供了六種位運算運算符;這些運算符可能只允許整型操作數,即char、short、int和long,無論signed或者unsigned。
          & 按位與(AND)
          | 按位或(OR)
          ^ 按位異或(XOR)
          << 左移
          >> 右移
          ~ 求反碼(一元運算)

          1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。

          例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。15&127=(01111111)&(00001111)=(00001111)=15
           
          按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
          #include <stdio.h>
          int main(void){
          int a=9,b=5,c;
          c=a&b;
          printf("a=%d\nb=%d\nc=%d\n",a,b,c);
          }

          2. 按位或運算 按位或運算符“|”是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
          例如:9|5可寫算式如下: 00001001|00000101
          00001101 (十進制為13)可見9|5=13
          int main(void){
          int a=9,b=5,c;
          c=a|b;
          printf("a=%d\nb=%d\nc=%d\n",a,b,c);
          }

          3. 按位異或運算 按位異或運算符“^”是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進制為12)
          int main(void){
          int a=9;
          a=a^15;
          printf("a=%d\n",a);
          }

          4. 求反運算 求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結果為:1111111111110110

          5. 左移運算 左移運算符“<<”是雙目運算符。其功能把“<< ”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數指定移動的位數,
          高位丟棄,低位補0。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位后為00110000(十進制48)。6. 右移運算右移運算符“>>”是雙目運算符。其功能是把“>> ”左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位數。
          例如:設 a=15,a>>2 表示把000001111右移為00000011(十進制3)。應該說明的是,對于有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決于編譯系統的規定。Turbo C和很多系統規定為補1。
          int main(void){
          unsigned a,b;
          printf("input a number: ");
          scanf("%d",&a);
          b=a>>5;
          b=b&15;
          printf("a=%d\tb=%d\n",a,b);
          }

          請再看一例!
          int main(void){
          char a='a',b='b';
          int p,c,d;
          p=a;
          p=(p<<8)|b;
          d=p&0xff;
          c=(p&0xff00)>>8;
          printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
          }



          posted on 2008-10-14 13:43 譚明 閱讀(655) 評論(0)  編輯  收藏 所屬分類: C/C++

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宣武区| 陕西省| 新安县| 福清市| 务川| 永和县| 罗源县| 柳河县| 游戏| 紫云| 兴海县| 弥勒县| 乌拉特中旗| 华宁县| 进贤县| 尚义县| 无棣县| 馆陶县| 胶州市| 天全县| 克东县| 乐业县| 阿拉善左旗| 武隆县| 神木县| 陵川县| 临沂市| 双柏县| 大名县| 卓资县| 霍林郭勒市| 宁国市| 禹州市| 淮滨县| 仙居县| 东城区| 加查县| 鄢陵县| 闽侯县| 吉木萨尔县| 高邑县|